PDO Mysql подготовленный оператор last_insert_id возвращает неправильное значение при множественной вставке? - PullRequest
1 голос
/ 06 августа 2011

Я заметил, что если я подготовлю оператор с несколькими вставками и выполню его в MySQL через PDO, а затем запросю last_insert_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".Это известная проблема или я что-то не так делаю?Может ли кто-нибудь проверить / проверить / объяснить это?Я в растерянности от того, что нужно сделать, чтобы получить правильный последний идентификатор, за исключением фактического выбора, который был бы НАМНОГО медленнее.

1 Ответ

1 голос
/ 06 августа 2011

Это правильное поведение 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)

...