网站首页 > 技术文章 正文
LAST_INSERT_ID()函数在MySQL中用于获取最后插入记录的自增ID值。该函数特别适用于那些具有自增主键的表,通常用于获取刚刚插入行的ID,以便进行后续操作。
一次插入多行,LAST_INSERT_ID()返回首行的id序号。
一次插入一行,LAST_INSERT_ID()返回该行的id序号。
基本用法
- 单条记录插入:当你向表中插入一条记录后,可以使用LAST_INSERT_ID()来获取该记录的自增ID值。例如:
INSERT INTO table_name (column1, column2) VALUES (value1, value2); SELECT LAST_INSERT_ID();
这将返回最后插入行的自增ID值。
- 多条记录插入:在一次性插入多条记录时,LAST_INSERT_ID()只能获取第一条插入记录的自增ID值。例如:
INSERT INTO table_name (column1, column2) VALUES (value1, value2), (value3, value4), (value5, value6); SELECT LAST_INSERT_ID();
这将返回第一条插入记录的自增ID值。
特点和限制
- 会话级别:LAST_INSERT_ID()函数是会话级别的,每个会话都有自己独立的最后插入ID值,不会受到其他会话的影响。
- 自增列:该函数只能用于获取具有AUTO_INCREMENT属性的列生成的值。如果最后插入的行没有自增列或自增列未设置,则返回0。
- 不受事务影响:即使在事务回滚后,LAST_INSERT_ID()仍然会返回已插入行的自增ID,不会因为事务回滚而改变。
使用场景和示例
- 记录关联插入:在插入主记录后,需要立即获取其自增ID以进行关联插入。例如,在订单管理系统中插入订单记录后,立即获取订单ID以关联产品信息。
- 存储过程和触发器:在存储过程或触发器中,可以使用LAST_INSERT_ID()来获取新插入记录的ID,并用于其他操作。
- 确保插入顺序:在某些情况下,需要确保插入操作的顺序,可以通过LAST_INSERT_ID()来获取最新插入记录的ID,从而确定操作的顺序。
MySQL中content_table的表结构如下:
CREATE TABLE content_table (
id INT AUTO_INCREMENT PRIMARY KEY,
descp VARCHAR(100) NOT NULL
);
执行
INSERT INTO content_table(descp) VALUES('r1'),('r2'),('r3');
后,再执行
SELECT LAST_INSERT_ID();
的结果是()?
A. 1
B. 3
C. 4
D. 执行报错
答案: A
题目解析
选A,
一次插入多行,LAST_INSERT_ID()返回首行的id序号。
一次插入一行,LAST_INSERT_ID()返回该行的id序号。
mysql> CREATE TABLE content_table (id INT AUTO_INCREMENT PRIMARY KEY, descp VARCHAR(100) NOT NULL );
Query OK, 0 rows affected (0.02 sec)
mysql> INSERT INTO content_table(descp) VALUES('r1'),('r2'),('r3');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 1 | -- 一次插入多行,返回首行的id序号
+------------------+
1 row in set (0.00 sec)
mysql> select * from content_table ;
+----+-------+
| id | descp |
+----+-------+
| 1 | r1 |
| 2 | r2 |
| 3 | r3 |
+----+-------+
3 rows in set (0.00 sec)
mysql> INSERT INTO content_table(descp) VALUES('r4'),('r5'),('r6');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 4 | -- 一次插入多行,返回首行的id序号
+------------------+
1 row in set (0.00 sec)
mysql> select * from content_table ;
+----+-------+
| id | descp |
+----+-------+
| 1 | r1 |
| 2 | r2 |
| 3 | r3 |
| 4 | r4 |
| 5 | r5 |
| 6 | r6 |
+----+-------+
6 rows in set (0.00 sec)
mysql> INSERT INTO content_table(descp) VALUES('r7');
Query OK, 1 row affected (0.00 sec)
mysql> select * from content_table ;
+----+-------+
| id | descp |
+----+-------+
| 1 | r1 |
| 2 | r2 |
| 3 | r3 |
| 4 | r4 |
| 5 | r5 |
| 6 | r6 |
| 7 | r7 |
+----+-------+
7 rows in set (0.00 sec)
mysql> SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
| 7 | -- 一次插入一行,返回该行的id序号
+------------------+
1 row in set (0.00 sec)
end
猜你喜欢
- 2025-05-02 MySQL自增ID用完了怎么办?4种解决方案!
- 2025-05-02 MySQL批量插入性能对比:100、1000、10000行,谁更胜一筹?
- 2025-05-02 牛哇!MySQL中的日志“binlog”的三种格式这么好玩
- 2025-05-02 从B+树原理到实战:MySQL索引设计的22条军规
- 2025-05-02 mysql数据库基本增删改查操作总结
- 2025-05-02 MySQL索引效率太快,1亿数据查询不到1秒
- 2025-05-02 MySQL大数据表处理策略,原来一直都用错了……
- 2025-05-02 在MySQL命令行中获取用户账户列表的方法
- 2025-05-02 MySQL分库分表设计方案:大道至简,数据不乱
- 2025-05-02 从零到亿级数据:MySQL 分库分表实战避坑指南
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- js判断是否空对象 (63)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- phprequire_once (61)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)