2011-08-06 45 views
1

我注意到,如果我準備一個多插入語句並通過PDO將其執行到MySQL中,然後請求last_insert_id,我會得到多個插入行的第一個ID,而不是最後一個。具體做法是:PDO Mysql預處理語句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」。 這是一個已知的問題,或者我做錯了什麼?有人可以驗證/測試/解釋這個嗎?我不知道該怎麼做才能得到正確的最後一個ID,除了做一個實際的選擇,這將是更慢的方式。

+0

這是MySQL的默認行爲。 –

回答

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) 

+0

我明白了,非常感謝您的瞭解。受影響的行如何計數 - 這種查詢還表示只有一行受到影響。這也是默認行爲嗎? – Swader