如何知道在使用"重复密钥更新"时是否插入或更新了一行?

mul*_*axp 27 mysql

我们有一个数据库,每天午夜使用cronjob进行更新,我们从外部XML获取新数据.

我们所做的是插入所有新内容,如果有重复的密钥,我们会更新该字段.

INSERT INTO table (id, col1, col2, col3)
values (id_value, val1, val2, val3),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
ON DUPLICATE KEY UPDATE 
col1 = VALUES (col1), 
col2 = VALUES (col2), 
col3 = VALUES (col3);
Run Code Online (Sandbox Code Playgroud)

我们想知道的是实际插入了哪些行,这意味着我们想要一个新项目的列表.有没有可能返回新插入的查询?基本上我们需要获得所有新ID,而不是新插入的数量.

谢谢

Mar*_*ams 34

您可以通过检查结果集中受影响的行数来在插入/更新时获取此信息.

MySQL 文档说明:

使用ON DUPLICATE KEY UPDATE时,如果将行作为新行插入,则每行的受影响行值为1;如果更新现有行,则每行受影响的行值为2.

您需要将ROW_COUNT与LAST_INSERT_ID结合使用以获得答案并一次插入一行.

  • 这有助于确定*插入的行数*与更新的行数有关,但不能确定哪些行。 (2认同)
  • 请记住,如果发生更新但具有相同的先前数据,则受影响的行将给出 0。 (2认同)

Qua*_*noi 7

添加update_count INT NOT NULL DEFAULT 1列并更改您的查询:

INSERT
INTO    table (id, col1, col2, col3)
VALUES
(id_value, val1, val2, val3),
(id_value, val1, val2, val3,),
(id_value, val1, val2, val3),
(id_value, val1, val2, val3),
ON DUPLICATE KEY
UPDATE 
        col1 = VALUES (col1), 
        col2 = VALUES (col2), 
        col3 = VALUES (col3),
        update_count = update_count + 1;
Run Code Online (Sandbox Code Playgroud)

您还可以在BEFORE UPDATE触发器中递增它,以允许您保持查询不变.