簡單聊聊MySQL的LAST_INSERT_ID()

簡介

很簡單,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';

得到結果:

1

再執行:

select LAST_INSERT_ID();

得到結果:

2

這裏返回了2,即最近一次insert的自增id值。

insert語句對自增字段賦值

這次我們在插入數據時直接對id賦值

INSERT last_insert_id_test
SET id = 5, name = 'HaHa';

然後再執行

SELECT LAST_INSERT_ID();

依舊會得到結果:

2

這也說明,LAST_INSERT_ID()會返回AUTO_INCREMENT生成的值,和自增字段最新的值無關。

插入多條數據

我們這次一次性插入多條數據

INSERT last_insert_id_test
(name) VALUES ('Yahoo'), ('HeiHei');

表中的數據變成了這個樣子

3

然後再執行

SELECT LAST_INSERT_ID();

我們會得到結果:

4

沒毛病哦~確實是返回了name爲Yahoo那行的id值

另一個連接

我們緊接着新建一個console,執行一下

SELECT LAST_INSERT_ID();

看看是不是還會返回剛纔的6。結果並不是,返回的是0。

5

我們在這個console裏執行一條簡單的插入語句

INSERT last_insert_id_test
SET name = 'Yoooo';

然後再執行

SELECT LAST_INSERT_ID();

得到的結果是8

6

我們再回到剛纔的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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章