在PHP上使用ON DUPLICATE KEY UPDATE时获取mysql_insert_id()

jul*_*lio 23 php mysql mysql-insert-id

我已经使用mySQL单独找到了一些答案,但是我希望有人可以告诉我在使用PHP处理插入/更新时获取mysql DB的最后一行或更新行的ID的方法.

目前我有这样的东西,其中column3是一个唯一的键,并且还有一个id列,它是一个自动增量的主键:

$query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
mysql_query($query);

$my_id = mysql_insert_id();
Run Code Online (Sandbox Code Playgroud)

INSERT上的$ my_id是正确的,但是当它更新一行时(ON DUPLICATE KEY UPDATE)不正确.

我看过几篇帖子,人们建议你使用类似的东西

INSERT INTO table (a) VALUES (0) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 
Run Code Online (Sandbox Code Playgroud)

在调用ON DUPLICATE KEY时获取有效的ID值 - 但这会将该有效ID返回给PHP mysql_insert_id()函数吗?

jul*_*lio 36

这是亚历山大建议的答案:

当你使用id = LAST_INSERT_ID(id)时,它设置mysql_insert_id =更新后的ID的值 - 所以你的最终代码应如下所示:

<?
    $query = mysql_query("
        INSERT INTO table (column1, column2, column3) 
        VALUES (value1, value2, value3) 
        ON DUPLICATE KEY UPDATE
            column1 = value1, 
            column2 = value2, 
            column3 = value3, 
            id=LAST_INSERT_ID(id)
    ");
    $my_id = mysql_insert_id();
Run Code Online (Sandbox Code Playgroud)

无论更新还是插入,这都将为$ my_id返回正确的值.

  • 这对我有帮助,但只是要清楚,对于其他有问题的人......如果记录已经存在并且得到更新,对LAST_INSERT_ID()的调用可以确保当你以后调用mysql_insert_id()时,它将返回id更新的记录,而不是通常的零.另请注意,"id"应替换为表中的auto_increment列名称.更多信息:http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html (6认同)
  • 如果正在更新的 id 被另一个表引用怎么办?这会引起麻烦吗? (2认同)

edo*_*ian 10

您可以检查Query是插入还是更新(mysql_affected_rows();在插入时返回1,在更新时返回2).

如果是插入使用mysql_insert_id,如果是更新,则需要另一个Query.

<?php
$query ="INSERT INTO TABLE (column1, column2, column3) VALUES (value1, value2, value3) ON DUPLICATE KEY UPDATE SET column1=value1, column2=value2, column3=value3";
mysql_query($query);
if(mysql_affected_rows() == 1) { $id = mysql_insert_id(); }
else { // select ... 
}
?>
Run Code Online (Sandbox Code Playgroud)

我知道你所寻找的并不是很令人兴奋,但这是我能想到的最好的

  • 如果没有更新(与db中的值相同),也不插入; 受影响的行返回0 (3认同)
  • 受影响的_rows() 的 +1 在插入时返回 1,在更新时返回 2。 (2认同)