我有以下查询:
INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE a=1
我希望获取插入或更新后的ID。通常情况下,我需要运行第二个查询以获取它,因为我认为 insert_id() 只能返回“插入”的ID,而不是更新后的ID。
是否有一种方法可以在插入/更新时一次性检索该行的ID,而无需运行两个查询?
请查看此页面:https://web.archive.org/web/20150329004325/https://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
在页面底部,它们解释了如何通过向该MySQL函数传递表达式来使LAST_INSERT_ID对于更新有意义。
从MySQL文档示例中可以看出:
如果一张表包含一个AUTO_INCREMENT列并且INSERT...UPDATE插入一行,则LAST_INSERT_ID()函数返回AUTO_INCREMENT值。 如果该语句更新一行,则LAST_INSERT_ID()没有意义。 但是,您可以通过使用LAST_INSERT_ID(expr)绕过此问题。 假设id是AUTO_INCREMENT列。 要使LAST_INSERT_ID()对于更新有意义,请按以下方式插入行:
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), c=3;
如果表包含一个AUTO_INCREMENT列,并且INSERT ... ON DUPLICATE KEY UPDATE插入或更新一行,则LAST_INSERT_ID()函数将返回AUTO_INCREMENT值。
- Erenor Paz确切地说,如果这是原始查询:
INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE a=1
如果'id'是自增主键,那么这将是可行的解决方案:
INSERT INTO table (a) VALUES (0)
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), a=1
在这里都有:http://dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html
如果表中包含一个AUTO_INCREMENT列,并且INSERT...UPDATE插入一行,则LAST_INSERT_ID()函数返回AUTO_INCREMENT值。 如果语句更新一行,那么LAST_INSERT_ID()就没有意义了。 但是,您可以通过使用LAST_INSERT_ID(expr)来解决此问题。 假设id是AUTO_INCREMENT列。
我遇到了一个问题,当使用 ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id) 时,会将主键增加1。因此,会使得下一个输入的id在当前会话中增加2。
如果您使用自增,现有的解决方案可以工作。但是我遇到了一个情况,用户可以定义一个前缀,并且序列应该从3000重新开始。由于这个不同的前缀,我不能使用自增,这导致插入时last_insert_id为空。我通过以下方式解决了这个问题:
INSERT INTO seq_table (prefix, id) VALUES ('$user_prefix', LAST_INSERT_ID(3000)) ON DUPLICATE KEY UPDATE id = LAST_INSERT_ID(id + 1);
SELECT LAST_INSERT_ID();
REPLACE的工作方式与INSERT完全相同, 只是如果表中的旧行具有与新行相同的值 PRIMARY KEY或UNIQUE索引,则旧行将被删除, 然后插入新行。
alter table tablename AUTO_INCREMENT = 0;
,以避免ID值中出现大的空隙。 - Frank Fortealter table
,还要考虑并发用户的情况? - doug65536