MySQL触发器将字段更新为id值

sze*_*ryf 17 mysql triggers insert

我想有一个触发器来执行插入记录的以下操作:

 # pseudocode
 if new.group_id is null
    set new.group_id = new.id
 else
    # don't touch it
 end
Run Code Online (Sandbox Code Playgroud)

更清楚地说:我有一个包含三列的表:idprimary key,group_idint,valuevarchar.

当我group_id像这样插入时:

INSERT INTO table(value, group_id) VALUES ('a', 10)
Run Code Online (Sandbox Code Playgroud)

我想:

id | group_id | value
---+----------+------
 1 |       10 | a
Run Code Online (Sandbox Code Playgroud)

但是当我省略时group_id:

INSERT INTO table(value) VALUES ('b')
Run Code Online (Sandbox Code Playgroud)

它应该自动设置id为此记录的:

id | group_id | value
---+----------+------
 2 |        2 | b
Run Code Online (Sandbox Code Playgroud)

是否可以使用触发器?(我知道我可以在插入后更新记录,但触发器会更好.)

Bil*_*win 29

即使使用触发器,我也不知道如何在一个语句中执行此操作.

@Lucky建议的触发器解决方案在MySQL中看起来像这样:

CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
  SET NEW.group_id = COALESCE(NEW.group_id, NEW.id);
END
Run Code Online (Sandbox Code Playgroud)

但是,有一个问题.在该BEFORE INSERT阶段中,id尚未生成自动生成的值.因此,如果group_id为null,则默认NEW.id为始终为0.

但是,如果您在此AFTER INSERT阶段中将此触发器更改为触发,那么您可以访问生成的值NEW.id,则无法修改列值.

MySQL不支持DEFAULT列的表达式,因此您也不能在表定义中声明此行为.

唯一的解决方案是执行INSERT,然后立即执行UPDATE更改,group_id如果它未设置.

INSERT INTO MyTable (group_id, value) VALUES (NULL, 'a');
UPDATE MyTable SET group_id = COALESCE(group_id, id) WHERE id = LAST_INSERT_ID();
Run Code Online (Sandbox Code Playgroud)

  • 那太糟糕了。即使在 2016 年 (2认同)