使用子查询更新MySQL表时触发ERROR 1093 (HY000)错误求助
解决MySQL ERROR 1093: 无法在FROM子句中指定更新的目标表
这个问题我太熟了!MySQL有个严格的限制——你没法在UPDATE/DELETE语句的FROM子句里直接引用要修改的目标表,这就是你碰到ERROR 1093 (HY000)的原因。你的原查询里,WHERE子句的子查询直接调用了myTable,刚好触发了这个限制。
先把你的数据表清晰列出来:
| id | pack_id | user_id | start_date | end_date | runtime |
|---|---|---|---|---|---|
| 1 | 52 | 9 | 2019-04-09 11:53:00 | 2019-04-09 11:54:00 | 60 |
| 2 | 52 | 9 | 2019-04-09 11:58:00 | NULL | NULL |
你的原始更新语句:
UPDATE myTable SET end_date = NOW(), runtime = TIMESTAMPDIFF(SECOND, start_date, NOW()) WHERE id = ( SELECT max(id) FROM myTable WHERE user_id = '9' AND pack_id = '52' )
错误提示:
ERROR 1093 (HY000) at line 1: You can't specify target table 'myTable' for update in FROM clause
给你两种靠谱的解决方法:
方案1:给子查询套一层临时表
把获取最大id的子查询再包一层SELECT,让MySQL把这个子查询的结果当成一个临时表,这样就不会和目标表myTable冲突了。修改后的SQL如下:
UPDATE myTable SET end_date = NOW(), runtime = TIMESTAMPDIFF(SECOND, start_date, NOW()) WHERE id = ( SELECT max_id FROM ( SELECT MAX(id) AS max_id FROM myTable WHERE user_id = '9' AND pack_id = '52' ) AS temp_table );
方案2:用JOIN关联更新(更高效)
另一种更简洁高效的写法是用JOIN来定位需要更新的记录,这种方式从根本上避开了直接引用目标表的问题:
UPDATE myTable t1 JOIN ( SELECT MAX(id) AS max_id FROM myTable WHERE user_id = '9' AND pack_id = '52' ) t2 ON t1.id = t2.max_id SET t1.end_date = NOW(), t1.runtime = TIMESTAMPDIFF(SECOND, t1.start_date, NOW());
这两种方法都能完美解决你的问题,执行后id=2的那条记录会被更新:end_date设为当前时间,runtime自动计算为start_date到当前时间的秒数。
内容的提问来源于stack exchange,提问作者executable
相关产品推荐
相关产品推荐

