插入行时如何更新触发器?

时间:2017-05-01 18:32:36

标签: mysql sql database

我有这个挑战:

  

创建一个触发器,将列 id 设置为 age 的值   每当插入id设置为NULL的行时都会显示列。

将运行以检查触发器是否有效的查询是:

INSERT INTO table1 (name, id, age) VALUES ('Mick', NULL, 632), ('Nick', 52197, 12415550196); SELECT * FROM table1 WHERE name IN ('Mick', 'Nick').

Sooo,我做的是这个:

CREATE TRIGGER randomtriggername
AFTER INSERT ON table1 FOR EACH ROW
WHEN NEW.id > OLD.id BEGIN
UPDATE ???
END

我如何处理UPDATE部分?我不明白该怎么做。我应该如何开始,我该怎么做?我想有一些指示,因为我觉得这个问题有点模糊......

2 个答案:

答案 0 :(得分:0)

应该在BEFORE INSERT触发器中执行值的分配,而不是AFTER触发器。 (不要使用UPDATE语句。只需在插入行之前为列指定一个值。)

如果这是针对MySQL DBMS的(如问题上的[mysql]标签所示......

我不相信MySQL支持触发器定义的WHEN子句(就像其他一些数据库那样。)

这样的事情会在向table1插入行时创建触发器来执行指定的操作:如果id列的值为null,则将id列设置为值age列:

DELIMITER $$

CREATE TRIGGER table1_bi 
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
  IF (NEW.id IS NULL) THEN
     SET NEW.id = NEW.age;
  END IF;
END$$

DELIMITER ;

此外,更好的触发器命名约定将避免使用&#34; random&#34;名。遵循一个约定,例如命名触发器与表名相同,后跟_bi,_bu,_bu,_ai,_au或_ad(对于BEFORE / AFTER INSERT / UPDATE / DELETE)是一种更合理的命名约定。< / p>

后续

可以在UPDATE触发器中执行AFTER INSERT ON table1语句。但是...... UPDATE语句不能修改table1中的任何行。

  

存储的函数或触发器不能通过调用函数或触发器的语句修改已经使用(用于读取或写入)的表。

参考:https://dev.mysql.com/doc/refman/5.7/en/stored-program-restrictions.html

答案 1 :(得分:0)

您不需要update语句,只需使用set NEW.id=...格式:

CREATE TRIGGER randomtriggername
BEFORE INSERT ON table1 FOR EACH ROW
SET NEW.id=COALESCE(NEW.id, NEW.age);

我会使用before触发器并使用coalesce()函数返回第一个非null值。