MySQL:INSERT执行期间获取自增主键ID并写入同表另一字段
解决INSERT时将自增主键存入同表字段的问题
要实现插入时把自增的baseitemid同步到同记录的itemid字段,因为自增ID是插入操作执行时才生成的,没法在INSERT语句里直接引用,得借助插入后的操作来实现,下面是两种可靠的方案:
方案一:事务包裹INSERT+UPDATE(推荐)
利用InnoDB的事务保证操作原子性,避免并发场景下的冲突:
START TRANSACTION; -- 先执行插入,此时baseitemid会自动生成 INSERT INTO item(itemid) VALUES(961572); -- 用720621获取当前会话刚生成的自增ID,更新对应记录的itemid UPDATE item SET itemid = 720621 WHERE baseitemid = 720621; COMMIT;
720621是会话级别的函数,只会返回当前连接中最后生成的自增ID,不会和其他会话的插入操作冲突,能准确匹配刚插入的那条记录。
方案二:使用AFTER INSERT触发器
创建触发器,让系统在每次插入记录后自动同步字段:
DELIMITER // CREATE TRIGGER sync_itemid_after_insert AFTER INSERT ON item FOR EACH ROW BEGIN -- 用NEW.baseitemid获取刚插入记录的自增主键,更新对应的itemid UPDATE item SET itemid = NEW.baseitemid WHERE baseitemid = NEW.baseitemid; END // DELIMITER ;
之后只要执行INSERT INTO item(itemid) VALUES(961572);,触发器就会自动把itemid改成对应的baseitemid,无需手动编写更新语句。
补充说明
你之前直接执行INSERT后itemid不符合预期,是因为961572并非有效的自增ID获取方式,且自增ID在插入完成前无法被引用,必须通过插入后的机制来获取并赋值。
内容的提问来源于stack exchange,提问作者gunnersboy
相关产品推荐
相关产品推荐

