LAST_INSERT_ID() LAST_INSERT_ID(expr) html
自動返回最後一個INSERT或 UPDATE 問詢爲 AUTO_INCREMENT列設置的第一個 發生的值。 mysql
mysql> SELECT LAST_INSERT_ID(); sql
-> 195 服務器
產生的ID 每次鏈接後保存在服務器中。這意味着函數向一個給定客戶端返回的值是該客戶端產生對影響AUTO_INCREMENT列的最新語句第一個 AUTO_INCREMENT值的。這個值不能被其它客戶端影響,即便它們產生它們本身的 AUTO_INCREMENT值。這個行爲保證了你可以找回本身的 ID 而不用擔憂其它客戶端的活動,並且不須要加鎖或處理。(由於last_insert_id是針對connection的) 函數
假如你使用一個非「magic」值來更新某一行的AUTO_INCREMENT 列,則LAST_INSERT_ID() 的值不會變化(換言之, 一個不是 NULL也不是 0的值)。 code
重點: 假如你使用單INSERT語句插入多個行, LAST_INSERT_ID() 只返回插入的第一行產生的值。其緣由是這使依靠其它服務器複製一樣的 INSERT語句變得簡單。 htm
例如: blog
mysql> USE test;
Database changed
mysql> CREATE TABLE t (
-> id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
-> name VARCHAR(10) NOT NULL
-> ); mysql> INSERT INTO t VALUES (NULL, 'Bob'); mysql> SELECT * FROM t; +----+------+| id | name | +----+------+| 1 | Bob | mysql> SELECT LAST_INSERT_ID(); -> 1; mysql> INSERT INTO t VALUES (NULL, 'Mary'), (NULL, 'Jane'), (NULL, 'Lisa'); mysql> SELECT * FROM t; +----+------+ | id | name | | 1 | Bob | | 2 | Mary | | 3 | Jane | | 4 | Lisa | +----+------+ mysql> SELECT LAST_INSERT_ID(); ->2;
雖然第二個問詢將3 個新行插入 t, 對這些行的第一行產生的 ID 爲 2, 這也是LAST_INSERT_ID()返回的值。 get
假如你使用 INSERT IGNORE而記錄被忽略,則AUTO_INCREMENT 計數器不會增量,而LAST_INSERT_ID() 返回0, 這反映出沒有插入任何記錄。 io
======================================經常使用用法=============================================
若給出做爲到LAST_INSERT_ID()的參數expr ,則參數的值被函數返回,並做爲被LAST_INSERT_ID()返回的下一個值而被記憶。這可用於模擬序列:
建立一個表,用來控制順序計數器並使其初始化: mysql> CREATE TABLE sequence (id INT NOT NULL); mysql> INSERT INTO sequence VALUES (0);
使用該表產生這樣的序列數 :
mysql> UPDATE sequence SET id=LAST_INSERT_ID(id+1);
mysql> SELECT LAST_INSERT_ID();
->1;
UPDATE 語句會增長順序計數器並引起向LAST_INSERT_ID() 的下一次調用,用來返回升級後的值。 SELECT 語句會檢索這個值。 mysql_insert_id() C API函數也可用於獲取這個值。
你能夠不用調用LAST_INSERT_ID()而產生序列,但這樣使用這個函數的效用在於 ID值被保存在服務器中,做爲自動產生的值。它適用於多個用戶,緣由是多個用戶都可使用 UPDATE語句並用SELECT語句(或mysql_insert_id()),獲得他們本身的序列值,而不會影響其它產生他們本身的序列值的客戶端或被其它產生他們本身的序列值的客戶端所影響。
注意, mysql_insert_id() 僅會在INSERT 和UPDATE語句後面被升級, 所以你不能在執行了其它諸如SELECT或 SET 這樣的SQL語句後使用 C API 函數來找回 LAST_INSERT_ID(expr) 對應的值。