我有这个挑战:
创建一个触发器,将列 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
部分?我不明白该怎么做。我应该如何开始,我该怎么做?我想有一些指示,因为我觉得这个问题有点模糊......
答案 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值。