作者:123sdf87_768 | 来源:互联网 | 2024-12-25 22:04
本文详细介绍了MySQL中LAST_INSERT_ID()函数的使用方法及其工作原理,包括如何获取最后一个插入记录的自增ID、多行插入时的行为以及在不同客户端环境下的表现。
MySQL 提供了 LAST_INSERT_ID()
函数用于返回最近一次插入操作中自增列(AUTO_INCREMENT)的第一个值。该函数对每个客户端连接是独立的,确保不同客户端之间的操作不会互相干扰。
SELECT LAST_INSERT_ID();
此函数返回的结果是在当前会话中最后一次成功执行 INSERT
或 UPDATE
语句时生成的 AUTO_INCREMENT 值。例如:
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;
如果在单个 INSERT
语句中插入多个行,LAST_INSERT_ID()
只返回第一个插入行的 AUTO_INCREMENT 值。这是为了确保在复制环境中的一致性:
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;
即使插入多个行,LAST_INSERT_ID()
也只会返回第一个插入行的 ID。此外,如果使用 INSERT IGNORE
且记录被忽略,则 AUTO_INCREMENT 计数器不会递增,LAST_INSERT_ID()
将返回 0。
可以通过给 LAST_INSERT_ID(expr)
提供参数来模拟序列功能。例如,创建一个控制顺序计数器的表并初始化:
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
语句则检索这个值。此外,C API 函数 mysql_insert_id()
也可以用来获取这个值。
需要注意的是,mysql_insert_id()
仅在 INSERT
和 UPDATE
语句之后被更新,因此不能在执行其他类型的 SQL 语句后使用它来获取 LAST_INSERT_ID(expr)
的值。