删除系统时删除其相关的关联关系(SQL语句)

1.初始问题

删除系统逻辑:

(1)在system表中删除系统主体,将is_deleted字段置为1

(2)删除系统与服务器的关联关系,将system_server中的相应is_deleted置为1

(3)删除系统的管理账号,将account中的相应is_deleted置为1

image

在步骤2中,想要使用SQL语句实现这样一个功能:对于已删除的系统,删除其关联关系,直观写法:

image

运行报错:不能先select出同一表中的某些值,再update这个表(在同一语句中)


2.寻找解决办法

(1)直接百度

说在查到的记录里面再select一遍,让这个结果在数据库眼中和要更新的表不是同一张表

image

还是错的,虽然后面找到解决方法了还是不知道这个为什么错了...


(2)绕开SQL

既然SQL语句实现不了这个过程,那我就将就一点,在程序逻辑中进行处理:先将select得到的system_server.id存到记录中,在遍历记录去更新is_deleted,结果也是很成功的

①函数

image

②SQL

image


(3)询问老师

虽然程序结果成功得出了,但是还是对SQL语句耿耿于怀,就去问老师为什么,然后老师说可以update from来更新,SQL语句的写法就变成了这样,但是还是错了

image

由于电脑当时没电,所以老师只是提供思路,回来写的时候才发现这样是错的,以为是自己写法错了,查半天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的语法重写了一遍,终于,成功了!!!

image

对应函数(即最初的函数)

image

posted @ 2022-04-19 21:59  脑袋凉凉  阅读(112)  评论(0编辑  收藏  举报