mysql LAST_INSERT_ID詳解


http://blog.sina.com.cn/s/blog_5b5460eb0100nwvo.html

 

LAST_INSERT_ID() LAST_INSERT_ID(expr)

自動返回最后一個INSERT或 UPDATE 問詢為 AUTO_INCREMENT列設置的第一個 發生的值。

mysql> SELECT LAST_INSERT_ID();

        -> 195

產生的ID 每次連接后保存在服務器中。這意味着函數向一個給定客戶端返回的值是該客戶端產生對影響AUTO_INCREMENT列的最新語句第一個 AUTO_INCREMENT值的。這個值不能被其它客戶端影響,即使它們產生它們自己的 AUTO_INCREMENT值。這個行為保證了你能夠找回自己的 ID 而不用擔心其它客戶端的活動,而且不需要加鎖或處理。(因為last_insert_id是針對connection的)

假如你使用一個非“magic”值來更新某一行的AUTO_INCREMENT 列,則LAST_INSERT_ID() 的值不會變化(換言之, 一個不是 NULL也不是 0的值)。

重點: 假如你使用單INSERT語句插入多個行,  LAST_INSERT_ID() 返回插入的第一行產生的值。其原因是這使依靠其它服務器復制同樣的 INSERT語句變得簡單。

例如:

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()返回的值。

假如你使用 INSERT IGNORE而記錄被忽略,則AUTO_INCREMENT 計數器不會增量,而 LAST_INSERT_ID() 返回0,這反映出沒有插入任何記錄。

======================================常用用法=============================================

若給出作為到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) 對應的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM