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

MySQL同表条件更新报错#1093:新值大于旧值时更新字段方案

解决方案:实现条件更新并解决1093报错

问题分析

报错#1093 - 不允许在FROM子句中使用要更新的目标表'invoice'是因为MySQL限制了在UPDATE/DELETE语句的子查询中直接引用正在修改的目标表。同时你的需求是仅当paid字段的新值大于旧值时,才更新paid_date,需要调整SQL逻辑来规避这个限制,同时保证条件判断准确。

方法1:使用用户变量存储旧值

先通过SELECT语句获取目标记录的旧paid值存入变量,再在UPDATE中使用该变量做判断,避免直接在UPDATE里查询目标表:

-- 先获取旧的paid值
SET @old_paid = (SELECT paid FROM invoice WHERE id = 48);

-- 执行更新
UPDATE `invoice` 
SET 
  `amount` = 400,
  `paid` = -50,
  `paid_date` = IF(-50 > @old_paid, '2022-10-14', `paid_date`),
  `remark` = 'abcde'
WHERE `id` = 48;

方法2:使用自连接UPDATE

通过将表与自身做JOIN,直接获取旧的paid值,无需额外变量声明:

UPDATE `invoice` AS t1
JOIN `invoice` AS t2 ON t1.id = t2.id
SET 
  t1.`amount` = 400,
  t1.`paid` = -50,
  t1.`paid_date` = IF(-50 > t2.paid, '2022-10-14', t1.paid_date),
  t1.`remark` = 'abcde'
WHERE t1.id = 48;

关键注意事项

  • 数据类型一致性:paid是decimal(10,2)类型,判断时要用数值(如-50)而非字符串('-50'),避免类型转换导致的比较错误。
  • 条件逻辑验证:你的测试数据中旧paid值是0.00,新值-50小于旧值,因此paid_date不会被更新;若新值大于旧值(比如设为100),则paid_date会被设置为指定日期。

内容的提问来源于stack exchange,提问作者Tom Friedrichs

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:20:58