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
相关产品推荐
相关产品推荐

