mysql UPDATE 语句逐一更新列?

标签 mysql sql sql-update mysql-8.0

我在 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 the current (updated) col1 value, not the original col1 value. The result is that col1 and col2 have the same value. This behavior differs from standard SQL.

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

Single-table UPDATE assignments are generally evaluated from left to right.

关于mysql UPDATE 语句逐一更新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65361117/

相关文章:

php - 我是否需要远程登录才能通过 php 脚本读取和写入 MySQL 数据库?

SQL 查询帮助 - 在开始日期和结束日期之间进行选择

mysql - 如何从sql中的 `describe`语句创建一个新表?

php - MySQL UPDATE JOIN 语句速度问题

MySQL引用子查询的结果

python - 将sql结果转换为list python

mysql - 如何在 Laravel 中更新多个列及其各自的值?

mysql - 如何在 mysql 中的三个表的另一个子查询中使用子查询?

mysql - 外键来自 SQL 中一列中的两个表

MYSQL : How to see if a varchar exists in another table