我注意到如果我准备一个多插入语句并通过PDO将它执行到MySQL,然后请求last_insert_id,我得到多个插入行的第一个ID,而不是最后一个。具体做法是:
"INSERT INTO test_table (value1, value2, value3) VALUES (1, 2, 3), (1, 2, 3)";
将在空表上创建这些行:
ID value1 value2 value3
1 1 2 3
2 1 2 3
但是last_insert_id将返回“1”。 这是一个已知问题还是我做错了什么?有人可以验证/测试/解释这个吗?我无法做什么来获得正确的最后一个ID,除了做一个实际的选择,这将是更慢的方式。
答案 0 :(得分:1)
这是正确的mysql行为
http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
mysql> USE test;
Database changed
mysql> CREATE TABLE t (
-> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> name VARCHAR(10) NOT NULL
-> );
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT INTO t VALUES (NULL, 'Bob');
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
| 1 | Bob |
+----+------+
1 row in set (0.01 sec)
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 |
+------------------+
1 row in set (0.00 sec)
mysql> INSERT INTO t VALUES
-> (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT * FROM t;
+----+------+
| id | name |
+----+------+
| 1 | Bob |
| 2 | Mary |
| 3 | Jane |
| 4 | Lisa |
+----+------+
4 rows in set (0.01 sec)
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 2 |
+------------------+
1 row in set (0.00 sec)
答案 1 :(得分:0)
您的问题很好,人们也在MySQL论坛上将其报告为错误。看到该链接:last_insert_id() inaccurate when inserting multiple rows
在同一链接上建议的解决方案是这样计算。
select row_count() + last_insert_id() - 1;