【问题标题】:Copy auto incremented value to other column during insert在插入期间将自动增量值复制到另一列
【发布时间】:2015-03-04 13:35:03
【问题描述】:

鉴于此表:

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 我运行得到 ​​p>

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (...)

我猜是因为object_id 还没有得到生成的值。

当然,我可以在插入后在我的代码中“手动”执行此操作,但我正在尝试尽可能少地执行代码托管语句。在插入语句期间有什么方法可以轻松实现这一点?

【问题讨论】:

  • 请显示所有代码:插入和触发。在我看来你需要使用序列,而不是触发

标签: mysql triggers


【解决方案1】:

你必须使用两个语句:

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) 

【讨论】:

    【解决方案2】:

    虽然有点古怪,但还有另一种可能的解决方案:

    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
    

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 2012-11-13
      • 1970-01-01
      • 2015-04-13
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 2012-02-02
      • 2017-04-12
      • 1970-01-01
      相关资源
      最近更新 更多