MySQL的触发器来更新的字段id的值(MySQL trigger to update a fiel

2019-06-17 20:55发布

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

 # pseudocode
 if new.group_id is null
    set new.group_id = new.id
 else
    # don't touch it
 end

更明确地说:说我有三列一个表: id主键, group_id INT, value为varchar。

当我插入带有group_id这样的:

INSERT INTO table(value, group_id) VALUES ('a', 10)

我想有:

id | group_id | value
---+----------+------
 1 |       10 | a

但是当我忽略group_id

INSERT INTO table(value) VALUES ('b')

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

id | group_id | value
---+----------+------
 2 |        2 | b

是否有可能与触发器? (我知道插入,但有触发的还要好后我可以更新记录。)

Answer 1:

我不知道任何方式在一个声明中这样做,即使使用触发器。

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

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

然而,有一个问题。 在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();


Answer 2:

我回答在这里,作为公认的答案比尔Karwin规定:

在BEFORE INSERT阶段,尚未产生值自动生成的ID。 所以,如果GROUP_ID为null,则默认为NEW.id这始终是0。


我有它的答案-为OP(和前来参观者),这里有几个要点:您无法更新从该触发被调用,因为你会得到错误1442表:

Error Code: 1442
Can't update table 'MyTable' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

1.to更新新行使用BEFORE INSERT ON触发,这样你可以更新为新行,这可以通过新的运营商即可以访问所有字段

set NEW.group_id = NEW.id

插入之前2.注册AUTO_INCREMENT值

SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='MyTable'

总结起来 - 为“触发SQL d是东西如下:

DELIMITER //
DROP TRIGGER IF EXISTS MyTrigger//
CREATE TRIGGER MyTrigger BEFORE INSERT ON MyTable
FOR EACH ROW BEGIN
    IF new.group_id IS NULL
        set @auto_id := (SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES
                         WHERE TABLE_NAME='MyTable' AND TABLE_SCHEMA=DATABASE() ); 
        set NEW.group_id = @auto_id;
    ENF IF;
END;
//
DELIMITER ;


Answer 3:

这对我的作品

DELIMITER $$
CREATE TRIGGER `myTriggerNameHere`
BEFORE INSERT ON `table` FOR EACH ROW
BEGIN
    SET NEW.group_id = IF(NEW.group_id IS NULL, LAST_INSERT_ID()+1, NEW.group_id);
END;
$$
DELIMITER ;


Answer 4:

我相信,这会为你工作

我有两个表

test_b: a_id, value
test_c: a_id, value

这里是测试B的插入的触发器。 它检查是否A_ID为空,如果是将其插入0

CREATE TRIGGER test_b AFTER INSERT ON test_b
  FOR EACH ROW 
    INSERT INTO test_c (a_id, value) VALUES (IFNULL(NEW.a_id, 0),NEW.value)


Answer 5:

这触发应该做你的要求。

   CREATE TRIGGER mytrigger BEFORE INSERT ON mytable
          IF new.group_id IS NULL
            SET new.group_id = new.id
          END IF
      END;

它是从一个非常类似的例子复制MySQL文档页面。



Answer 6:

触发好像在这种情况下矫枉过正。 简单应用默认。

CREATE TABLE `test` (
    `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    `value` varchar(100) NOT NULL,
    `group_id` TINYINT(3) UNSIGNED NOT NULL DEFAULT '2'
)


文章来源: MySQL trigger to update a field to the value of id