LAST_INSERT_ID 在 UPDATE 上不起作用

Posted

技术标签:

【中文标题】LAST_INSERT_ID 在 UPDATE 上不起作用【英文标题】:LAST_INSERT_ID not working on UPDATE 【发布时间】:2013-08-30 10:37:29 【问题描述】:

如果我使用这个 SQL:

UPDATE formulare SET EV_id=59, EV_status=5 WHERE EV_id=57 AND ID_uziv=12;SELECT LAST_INSERT_ID();

我会得到0 作为最后一个插入ID。 我正在使用 php mysqli_insert_id,据说:

The mysqli_insert_id() function returns the ID generated by a query 
on a table with a column having the AUTO_INCREMENT attribute. 
If the last query wasn't an INSERT or UPDATE statement 
or if the modified table does not have a column with the AUTO_INCREMENT attribute, 
this function will return zero. 

我的表formualreauto increment 列,所以我不知道问题出在哪里

【问题讨论】:

update 不会给你最后的插入 id。它只会给你更新的记录数。最后的插入 id 只用于插入 last_ insert _id 应该告诉你任何你需要知道的事情。没有插入任何东西。所以没有返回ID。 你能链接到你引用的文档吗? documentation here 我对您的回答在@dystroy 回答下 【参考方案1】: 如果 no 创建了新的自动增量值,

LAST_INSERT_ID() 将不起作用。

解决办法是这样的:

UPDATE formulare
  SET EV_id=LAST_INSERT_ID(59),
    EV_status=5
  WHERE EV_id=57
    AND ID_uziv=12;
SELECT LAST_INSERT_ID();

注意:我猜,EV_id 是 auto_increment 主键。

否则你应该做这样的查询:

UPDATE formulare
  SET key_col = LAST_INSERT_ID(key_col),
    EV_id=59,
    EV_status=5
  WHERE EV_id=57
    AND ID_uziv=12;
SELECT LAST_INSERT_ID();

【讨论】:

在行更新时执行INSERT ... ON DUPLICATE KEY UPDATE 查询以获取id 也非常有用。甚至文档也提到了这个技巧。 :)【参考方案2】:

来自the documentation:

上一个查询为 AUTO_INCREMENT 列生成的 ID 成功,如果上一个查询没有生成 AUTO_INCREMENT,则为 0 值,如果没有建立 MySQL 连接,则为 FALSE。

由于您的更新没有创建新记录,因此它没有生成任何 AUTO_INCREMENT 值。

【讨论】:

好的,但是为什么会有这个...If the last query wasn't an INSERT or UPDATE statement... 这句话很好奇,但可能作者指的是this kind of statement。【参考方案3】:

UPDATE 查询更新现有记录,它不返回任何新 ID。

mysqli_insert_id retrieves the ID generated for an AUTO_INCREMENT column by the        
previous query (usually INSERT).

没有 INSERT 查询,这就是原因,执行 UPDATE 查询后你不会得到任何 Id。

更多信息,请参考mysql_insert_id

【讨论】:

以上是关于LAST_INSERT_ID 在 UPDATE 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

mysql sql获取上条插入id,update影响行数

如何从 LAST_INSERT_ID(`my_column`+1) 获取表达式的值?

阿里读写分离数据源SELECT LAST_INSERT_ID()获取不到id

mybatis---------insert,delete ,update的批量操作

Last_insert_id 的效率如何?

如何在 WebMatrix 中使用 LAST_INSERT_ID()