【问题标题】:How to know if when using "on duplicate key update" a row was inserted or updated?如何知道在使用“重复键更新”时是否插入或更新了一行?
【发布时间】:2012-05-22 20:07:00
【问题描述】:

我们有一个每天午夜通过 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);

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

谢谢

【问题讨论】:

    标签: mysql


    【解决方案1】:

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

    MySQL documentation 状态:

    如果使用 ON DUPLICATE KEY UPDATE,每行的受影响行值为 1,如果 该行作为新行插入,如果现有行被更新,则插入 2。

    您需要将 ROW_COUNT 与 LAST_INSERT_ID 结合起来才能获得答案并一次插入一行。

    【讨论】:

    • 这有助于确定 有多少 行被插入和更新,但不知道是哪...
    • 是的,我们想到了这一点,但我需要知道插入行的主键,而不是插入行的数量或计数。
    • @EddyXP,您需要将 ROW_COUNT 与 LAST_INSERT_ID 结合起来才能获得答案并一次插入一行。
    • 请记住,如果发生更新但使用相同的先前数据,受影响的行将给出 0。
    【解决方案2】:

    添加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;
    

    您还可以在 BEFORE UPDATE 触发器中增加它,这将允许您保持查询不变。

    【讨论】:

    • 感谢 Quassnoi,好主意,我确实使用了一个名为 udpated 的新专栏,并用不同的方法应用了您的想法,这实际上对我很有用,请查看您对我所做修改的回答并给我一些反馈.非常感谢。
    【解决方案3】:

    我可以说我在 PHP 中的表现:

    1) 简单查询 SELECT MAX(id) 并在 Insert On Duplicate 之前记住它到 $max_id from table。

    2) 然后在更新过程中收集受影响行的 ID(无论是新的还是存在的):$ids[] = mysql_insert_id();

    3) 那么$inserted_rows = max($ids)-$max_id;

    4) 更新行数 = count($ids_srt)-$inserted_rows

    $max_id = mysql_query("SELECT MAX(id) from table");
    $max_id = mysql_result($max_id, 0);
    
    // !!! prepare here 'insert on duplicate' query in a cycle
    
    $result=mysql_query($query);
    $ids[] = mysql_insert_id();
    
    // finish inserting and collecting affected ids and close cycle
    
    $inserted_rows = max($ids)- $max_id;
    $updated_rows = count($ids)- $inserted_rows
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 2016-07-18
      • 1970-01-01
      • 2014-02-24
      • 2013-08-02
      相关资源
      最近更新 更多