删除系统时删除其相关的关联关系(SQL语句)
1.初始问题
删除系统逻辑:
(1)在system表中删除系统主体,将is_deleted字段置为1
(2)删除系统与服务器的关联关系,将system_server中的相应is_deleted置为1
(3)删除系统的管理账号,将account中的相应is_deleted置为1
在步骤2中,想要使用SQL语句实现这样一个功能:对于已删除的系统,删除其关联关系,直观写法:
运行报错:不能先select出同一表中的某些值,再update这个表(在同一语句中)
2.寻找解决办法
(1)直接百度
说在查到的记录里面再select一遍,让这个结果在数据库眼中和要更新的表不是同一张表
还是错的,虽然后面找到解决方法了还是不知道这个为什么错了...
(2)绕开SQL
既然SQL语句实现不了这个过程,那我就将就一点,在程序逻辑中进行处理:先将select得到的system_server.id存到记录中,在遍历记录去更新is_deleted,结果也是很成功的
①函数
②SQL
(3)询问老师
虽然程序结果成功得出了,但是还是对SQL语句耿耿于怀,就去问老师为什么,然后老师说可以update from来更新,SQL语句的写法就变成了这样,但是还是错了
由于电脑当时没电,所以老师只是提供思路,回来写的时候才发现这样是错的,以为是自己写法错了,查半天update from的写法,一点问题没有,直到---
(4)最终解决
来自这篇blog的整理:https://www.cnblogs.com/wuxiang/p/3701586.html
原来,三种数据库:mysql,sql server,oracle 对此的解决方法各不相同
①mysql-----inner join
update a inner join b on a.id = b.id set a.name = b.name②sql server-----update from
update a set a.name=b.name from a, b where a.id=b.id③oracle
在 oracle 中不存在 update from 结构, 所以遇到需要从另外一个表来更新本表的值的问题的时候,
有两种解决的办法 :
一种是使用子查询:
使用子查询时一定要注意where条件(一般后面接exists子句),除非两个表是一一对应的,否则where条件必不可少,遗漏掉where条件时可能会导致插入大量空值。
另外一种是类视图的更新方法:
这也是oracle所独有的。先把对应的数据全部抽取出来,然后更新表一样更新数据,这里需要注意的是,必须保证表的数据唯一性。
(5)具体应用
此时(3)中的问题就可以明白了,老师教的是sql server,我用的是mysql哈哈哈,然后就按照inner join的语法重写了一遍,终于,成功了!!!
对应函数(即最初的函数)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构