得到insert语句的ID值

一个实际应用中的需求

在使用Mysql数据库时,使用AUTO_INCREMENT来使主键自增, 比如

User(id,name,password,age)

插入一个User(name,password,age)实例后,需要用到mysql数据库自增的Id属性,

Mybatis 给了很好的解决方案 在insert中的一个属性keyProperty="实例类中的id字段名" ,但接口方法的返回值仍然是对数据库操作影响的行数

这样在给user对象插入后,Mybatis会自动将id属性注入个原来的users对象

如下代码

 

中间是log4j的输出语句,不用理会

 

 

 

想当方便吧!

你可能是想表达:“如何在 MySQL 的 `INSERT` 语句中使用**最后插入的自增 ID**”,比如将某个字段设置为刚刚插入记录的自增 `id` 。这在某些场景下很有用,例如父子记录关联、复制数据等。 MySQL 提供了内置函数 `LAST_INSERT_ID()` 来获取当前会话中最后一次自动生成的 `AUTO_INCREMENT` 。 --- ### ✅ 示例:使用 `LAST_INSERT_ID()` 实现“插入并引用最后的自增 ID” 假设我们有一个表 `users`: ```sql CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), ref_id INT -- 引用自己或其他行的 id ); ``` 现在我们要做两件事: 1. 插入一条新记录 A。 2. 再插入一条记录 B,并让它的 `ref_id` 指向 A 的 `id`(即上一次插入的自增 ID)。 #### ✅ 正确做法(在同一个会话中): ```sql -- 第一步:插入原始记录 INSERT INTO users (name, ref_id) VALUES ('Alice', NULL); -- 第二步:插入新记录,ref_id 指向上一条的自增 ID INSERT INTO users (name, ref_id) VALUES ('Bob', LAST_INSERT_ID()); ``` 此时 Bob 的 `ref_id` 就是 Alice 的 `id`。 > 🔍 注意:`LAST_INSERT_ID()` 返回的是当前连接(会话)中最近一次 **成功插入** 自动生成的 `AUTO_INCREMENT` ,即使你在中间执行了其他 SQL,只要没有新的自增插入,它仍然保留上次的。 --- ### 🧪 验证结果 ```sql SELECT * FROM users; ``` 输出可能如下: | id | name | ref_id | |-----|--------|--------| | 1 | Alice | NULL | | 2 | Bob | 1 | 说明 Bob 的 `ref_id = 1` 成功引用了 Alice。 --- ### 💡 应用场景扩展 #### 场景:主从表插入(如订单和订单项) ```sql -- 插入主表 order_header INSERT INTO order_header (customer, create_time) VALUES ('Tom', NOW()); -- 使用 LAST_INSERT_ID() 获取刚生成的 order_id,插入 order_item INSERT INTO order_item (order_id, product, qty) VALUES (LAST_INSERT_ID(), 'iPhone', 1); ``` 这样就能确保订单项正确关联到刚创建的订单。 --- ### ⚠️ 注意事项 - `LAST_INSERT_ID()` 是**会话级**的,不同客户端不会互相干扰,很安全。 - 如果你在两次插入之间执行了其他带有自增插入的操作(比如触发器、其他表),可能会得到错误的 ID。 - 不要在多线程或高并发环境中依赖全局变量方式获取 ID,应优先使用数据库驱动提供的 `last_insert_id()` 方法(如 Python 的 `cursor.lastrowid`)。 --- ### ✅ 在程序中使用(Python 示例) ```python import pymysql conn = pymysql.connect(host='localhost', user='root', password='pwd', database='test') cursor = conn.cursor() # 插入父记录 cursor.execute("INSERT INTO users (name) VALUES (%s)", ('Alice',)) conn.commit() # 获取最后插入的 ID last_id = cursor.lastrowid # 插入子记录,引用 last_id cursor.execute("INSERT INTO users (name, ref_id) VALUES (%s, %s)", ('Bob', last_id)) conn.commit() conn.close() ``` --- ### 总结 要让 `INSERT` 语句中的某个字段等于“最后插入的自增 ID”,可以使用: ```sql INSERT INTO table2 (..., ref_id) VALUES (..., LAST_INSERT_ID()); ``` 前提是前一个 `INSERT` 已经生成了一个自增 ID,且在同一个会话中。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值