如何解决如何在Mysql触发器中更新LAST_INSERT_ID
在我的MySQL数据库中,我有一个带有复合主键的表,其中ID为不在自动增量模式下。像这样的东西:
CREATE TABLE table_a (
fk_table_b INT UNSIGNED NOT NULL,id INT UNSIGNED,label VARCHAR(80) NOT NULL,PRIMARY KEY (fk_table_b,id),FOREIGN KEY fk_table_b
REFERENCES table_b(id)
);
要增加外键功能中的ID,我做了一个触发器:
DELIMITER $$
CREATE TRIGGER table_a_auto_increment
BEFORE INSERT ON table_a
FOR EACH ROW BEGIN
SET NEW.id = (
SELECT IFNULL(MAX(id),0) + 1
FROM table_a
WHERE table_a.fk_table_b = NEW.fk_table_b
);
END $$
DELIMITER ;
但是,当我执行SELECT LAST_INSERT_ID()
时,我得到0作为新的id ...通常,您可以通过给 LAST_INSERT_ID()这样的数字来覆盖它:
INSERT table_a ( fk_table_b,id)
VALUES (1,LAST_INSERT_ID(5));
SELECT LAST_INSERT_ID(); -- -> it gives me 5
所以我尝试将两者结合起来以执行此触发器:
DELIMITER $$
CREATE TRIGGER table_a_auto_increment
BEFORE INSERT ON table_a
FOR EACH ROW BEGIN
SET NEW.id = (
SELECT LAST_INSERT_ID(IFNULL(MAX(id),0) + 1)
FROM table_a
WHERE table_a.fk_table_b = NEW.fk_table_b
);
END $$
DELIMITER ;
但是当我在基础中插入内容时,它仍然给我0 ...您知道是否有办法使它起作用吗?
非常感谢。
-编辑2020-08-14
最后,似乎无法在TRIGGER中覆盖LAST_INSERT_ID函数,因此我通过删除触发器并在我的插入函数中执行如下操作来更改解决方案:
INSERT table_a ( fk_table_b,id,label)
VALUES (1,LAST_INSERT_ID((
SELECT IFNULL(MAX(old_one.id),0) + 1
FROM table_a AS old_one
WHERE old_one.fk_table_b = table_a.fk_table_b
)),"something");
然后,这给了我可以在后端使用的好结果:)
解决方法
您可以使用其他服务表:
CREATE TABLE service_table (id BIGINT AUTO_INCREMENT PRIMARY KEY);
和
DELIMITER $$
CREATE TRIGGER table_a_auto_increment
BEFORE INSERT ON table_a
FOR EACH ROW
BEGIN
SET NEW.id = (
SELECT IFNULL(MAX(id),0) + 1
FROM table_a
WHERE table_a.fk_table_b = NEW.fk_table_b
);
DELETE FROM service_table WHERE id IS NOT NULL;
INSERT INTO service_table VALUES (NEW.id - 1);
INSERT INTO service_table VALUES (NULL);
SET NEW.id = LAST_INSERT_ID() - 1;
END $$
DELIMITER ;
fiddle(已删除外键)。
- 也许可以简化代码-自己动手。
- 服务表可以定义为Engine = MEMORY(如果可用)。
- 该代码对于并发插入并不安全。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。