簡介
很簡單,LAST_INSERT_ID()會返回最近執行的insert語句中由AUTO_INCREMENT生成的值。
注意一下幾點:
- 如果最近一條insert語句不涉及到AUTO_INCREMENT字段,也不會影響到LAST_INSERT_ID()的值。
- insert需要成功插入數據,如果執行失敗,LAST_INSERT_ID()不會改變。
- insert語句如果指定了AUTO_INCREMENT字段的值,LAST_INSERT_ID()返回的值不會改變。
- insert語句如果一次插入多行數據,則LAST_INSERT_ID()會返回插入的第一條數據的AUTO_INCREMENT值。
- LAST_INSERT_ID()返回的值,在服務器端是以每個連接爲基礎保存的,也就是說,對於不同的連接,返回的值是不一樣的。
例子
下面用幾個例子來看看LAST_INSERT_ID()的具體使用。
首先我們設計一張很簡單的表:
CREATE TABLE last_insert_id_test
(
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(10) DEFAULT 'boom' NOT NULL,
CONSTRAINT last_insert_id_test_id_uindex
UNIQUE (id)
)
ENGINE = InnoDB;
其中id是自增的。
正常情況
我們先執行兩條插入語句:
INSERT last_insert_id_test set name = 'yeah';
INSERT last_insert_id_test set name = 'oh';
得到結果:
再執行:
select LAST_INSERT_ID();
得到結果:
這裏返回了2,即最近一次insert的自增id值。
insert語句對自增字段賦值
這次我們在插入數據時直接對id賦值
INSERT last_insert_id_test
SET id = 5, name = 'HaHa';
然後再執行
SELECT LAST_INSERT_ID();
依舊會得到結果:
這也說明,LAST_INSERT_ID()會返回AUTO_INCREMENT生成的值,和自增字段最新的值無關。
插入多條數據
我們這次一次性插入多條數據
INSERT last_insert_id_test
(name) VALUES ('Yahoo'), ('HeiHei');
表中的數據變成了這個樣子
然後再執行
SELECT LAST_INSERT_ID();
我們會得到結果:
沒毛病哦~確實是返回了name爲Yahoo那行的id值
另一個連接
我們緊接着新建一個console,執行一下
SELECT LAST_INSERT_ID();
看看是不是還會返回剛纔的6。結果並不是,返回的是0。
我們在這個console裏執行一條簡單的插入語句
INSERT last_insert_id_test
SET name = 'Yoooo';
然後再執行
SELECT LAST_INSERT_ID();
得到的結果是8
我們再回到剛纔的console,執行一下
SELECT LAST_INSERT_ID();
發現結果依然是6.所以這說明,LAST_INSERT_ID()返回的值,是不同的連接各自維護的啦。因此多個客戶端同時連接一個數據庫時,之間不會互相影響LAST_INSERT_ID()返回值,也就不用考慮併發問題也不用使用事務了。
官方文檔
https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_last-insert-id