为何EXISTS语句在DELETE与UPDATE查询中表现不同?
为什么EXISTS在DELETE和UPDATE中表现不同?
先看你的DELETE语句
DELETE FROM Orders WHERE EXISTS (SELECT * FROM Customers WHERE Customers.customer_id = Orders.c_id AND Customers.lname = '4');
这个语句里的EXISTS是关联子查询:子查询通过Customers.customer_id = Orders.c_id和外层的Orders表建立了关联。数据库会逐行检查Orders表的每一条记录,判断是否存在对应的Customers记录满足lname='4'。只有符合这个关联条件的Orders行才会被删除,这是完全符合预期的行为。
再看你的UPDATE语句
UPDATE Customers SET lname = 'aaa' WHERE EXISTS (SELECT * FROM Customers WHERE customer_id = 401);
这个语句里的EXISTS是非关联子查询:子查询只检查Customers表中是否存在customer_id=401的记录,和外层的UPDATE操作没有任何关联。只要数据库里存在这条记录,子查询就会返回TRUE,而UPDATE的WHERE条件对表中所有行都会生效,自然就更新了整个Customers表。
问题核心
你在UPDATE里的子查询没有和外层表关联,导致EXISTS的结果是全局的,而非逐行判断。如果你的意图是只更新customer_id=401的行,直接写WHERE customer_id=401即可;如果是要基于其他关联逻辑更新,需要在子查询里加上关联条件(比如和外层的Customers表用主键关联)。
内容的提问来源于stack exchange,提问作者jjjunior
相关产品推荐
相关产品推荐

