在插入期间将自动递增值复制到其他列

时间:2015-03-04 13:35:03

标签: mysql triggers

鉴于此表:

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_idoriginal_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还没有获得生成的值。

当然我可以这样做"手动"在插入后的代码中,但我尝试尽可能少地执行代码管理语句。有没有办法在插入语句中轻松实现这一点?

2 个答案:

答案 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

希望这有帮助。