You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用子查询更新MySQL表时触发ERROR 1093 (HY000)错误求助

解决MySQL ERROR 1093: 无法在FROM子句中指定更新的目标表

这个问题我太熟了!MySQL有个严格的限制——你没法在UPDATE/DELETE语句的FROM子句里直接引用要修改的目标表,这就是你碰到ERROR 1093 (HY000)的原因。你的原查询里,WHERE子句的子查询直接调用了myTable,刚好触发了这个限制。

先把你的数据表清晰列出来:

idpack_iduser_idstart_dateend_dateruntime
15292019-04-09 11:53:002019-04-09 11:54:0060
25292019-04-09 11:58:00NULLNULL

你的原始更新语句:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:01:53