鉴于此表:
CREATE TABLE object
(
object_id int NOT NULL AUTO_INCREMENT,
root_id int NOT NULL,
name varchar(255),
PRIMARY KEY(object_id)
)
列root_id
是一个自引用外键。
基本上我想要的是root_id
在插入新记录时默认为与object_id
相同的值,如果root_id
为NULL。
我认为触发器可以解决这个问题。
CREATE TRIGGER add_default_original_id AFTER INSERT ON object
FOR EACH ROW BEGIN
IF (NEW.original_id IS NULL) THEN
SET NEW.original_id = NEW.object_id;
END IF;
END;
所以当我运行时:
INSERT INTO object(name) values('test')
我希望object_id
和original_id
都具有相同的自动生成值
使用触发器AFTER INSERT后,我得到了
Error Code: 1362. Updating of NEW row is not allowed in after trigger
使用触发器BEFORE INSERT我运行得到
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (...)
我猜是因为object_id
还没有获得生成的值。
当然我可以这样做"手动"在插入后的代码中,但我尝试尽可能少地执行代码管理语句。有没有办法在插入语句中轻松实现这一点?
答案 0 :(得分:0)
您必须使用两个声明:
INSERT INTO object(object_id, root_id, name) values(NULL, NULL, 'test')
UPDATE object set root_id = (select max(object_id) from object)
where id = (select max(object_id) from object)
答案 1 :(得分:0)
还有另一种可能的解决方案,虽然有点怪癖:
CREATE TRIGGER add_default_original_id AFTER INSERT ON object
FOR EACH ROW BEGIN
BEGIN
SET NEW.root_id = (
SELECT `AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'XXX'
AND TABLE_NAME = 'object');
END
希望这有帮助。