单表UPDATE更新最新日期:解决同表SELECT与UPDATE冲突问题
单表UPDATE时引用自身查询结果的问题解决
问题场景
我有一张存储会员信息的test表,added字段记录会员的加入日期。需要将所有added字段为最新日期的记录(可能是单条或多条)更新为2023-08-24。尝试了直接在UPDATE的WHERE子句中嵌套查询自身表的语句,但无法正常执行:
UPDATE `test` SET `added` = `2023-08-24` WHERE `added` = ( SELECT * FROM `test` WHERE `added` = (select max(`added`) FROM `test`); )
单独执行其中的SELECT子查询可以正确获取目标数据,但组合UPDATE后失效,代码将在PHP环境中运行。
可行解决方案
通过增加一层嵌套子查询(临时表)绕开MySQL的限制,最终可用的SQL语句如下:
UPDATE `test` SET `added` = '2023-08-24' WHERE `added` IN ( SELECT * from ( SELECT MAX(`added`) FROM `test` ) as t );
原语句失效原因
MySQL不允许在对一张表执行UPDATE/DELETE操作时,直接在WHERE子句中引用该表的未更新数据。将MAX(added)的查询包装在一个命名为t的临时子查询中,相当于生成了一个独立的临时结果集,这样就可以安全地在UPDATE语句中引用它。
内容的提问来源于stack exchange,提问作者Chris Oliver
相关产品推荐
相关产品推荐

