- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 mysql 8 中编写了一个查询,其中在插入的重复键上,由于唯一索引,它仅在特定条件下更新受影响的行。我的条件是 started_on
列值是否已更改。所以我写了这个查询
INSERT INTO timers (
started_on,
end_on,
message,
first_alert_before_end_time,
alerts_interval,
referred_flow_instance_id,
referred_page_id,
referred_json_timer_id,
started_by_user_id
) VALUES (
'2025-01-06',
DATE_ADD('2025-01-06', INTERVAL 5184000 SECOND),
'Sta scadendo il fascicolo',
2592000,
86400,
1413,
14,
1,
79
)
ON DUPLICATE KEY
UPDATE
started_on = IF( DATE(started_on) = DATE('2025-01-01'), started_on, '2025-01-06'),
end_on = IF( DATE(started_on) = DATE('2025-01-01'), end_on, DATE_ADD('2025-01-06', INTERVAL 5184000 SECOND)),
started_by_user_id = IF( DATE(started_on) = DATE('2025-01-01'), started_by_user_id, 79),
deleted_by_user_id = IF( DATE(started_on) = DATE('2025-01-01'), deleted_by_user_id, NULL),
reminded_later_by_user_id = IF( DATE(started_on) = DATE('2025-01-01'), reminded_later_by_user_id, NULL),
deleted = IF( DATE(started_on) = DATE('2025-01-01'), deleted, 0)
;
我不会分析有效的插入,只会分析重复键部分的更新。
我注意到一个意想不到的结果:当更新中的 IF 条件为真时,只有 started_on 被更新但没有其他具有完全相同条件的列。
所以我的直觉是我的更新查询的第一行 (started_on = IF( DATE(started_on) = DATE('2025-01-01'), started_on, '2025-01-06'
), 突然更新 started_on 列,因此以下条件结果为 false,因为值已更改。我尝试的是将 update started_on 的部分放在 update 中所有列的末尾,现在它们都得到了更新。
如果我的直觉是正确的,我想确定并找到确认,但在网上搜索了一下后,我一无所获。
编辑:似乎通过 mysql workbench 在顶部运行更新 started_on 的查询即使在顶部也能正常工作,但我需要使用 xdevapi 库在节点中运行它并且只有放在底部时它才有效。
最佳答案
你的直觉是正确的。
此行为记录在 13.2.13 UPDATE Statement 中举个例子:
The second assignment in the following statement sets col2 to thecurrent (updated) col1 value, not the original col1 value. The resultis that col1 and col2 have the same value. This behavior differs fromstandard SQL.
UPDATE t1 SET col1 = col1 + 1, col2 = col1;
Single-table UPDATE assignments are generally evaluated from left toright.
关于mysql UPDATE 语句逐一更新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65361117/
我是一名优秀的程序员,十分优秀!