Mysql 插入行时如何更新触发器?
我有一个挑战: 创建将列id设置为年龄值的触发器 每当插入id设置为NULL的行时,都会显示该列 将运行以检查触发器是否工作的查询是:Mysql 插入行时如何更新触发器?,mysql,sql,database,Mysql,Sql,Database,我有一个挑战: 创建将列id设置为年龄值的触发器 每当插入id设置为NULL的行时,都会显示该列 将运行以检查触发器是否工作的查询是: INSERT INTO table1 (name, id, age) VALUES ('Mick', NULL, 632), ('Nick', 52197, 12415550196); SELECT * FROM table1 WHERE name IN ('Mick', 'Nick'). 苏欧,我所做的是: CREATE TRIGGER randomtrig
INSERT INTO table1 (name, id, age) VALUES ('Mick', NULL, 632), ('Nick', 52197, 12415550196); SELECT * FROM table1 WHERE name IN ('Mick', 'Nick').
苏欧,我所做的是:
CREATE TRIGGER randomtriggername
AFTER INSERT ON table1 FOR EACH ROW
WHEN NEW.id > OLD.id BEGIN
UPDATE ???
END
如何进行
更新
部分?我不知道该怎么做。我应该如何开始,具体应该做什么?我想知道一些方向,因为我发现这个问题有点模糊…向列赋值应该在插入触发器之前的中执行,而不是在触发器之后的中执行。(不要使用UPDATE
语句。只需在插入行之前为列赋值即可。)
如果这是针对MySQL DBMS的(如问题上的[MySQL]标记所示)
我不相信MySQL支持触发器定义上的WHEN
子句(就像其他一些数据库一样)
类似这样的操作将创建一个触发器,在将行插入表1时执行指定的操作:如果id
列的值为空,则将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 ;
此外,更好的触发器命名约定可以避免使用“随机”名称。遵循约定,例如将触发器命名为与表名相同的名称,然后是_-bi、_-bu、_-bu、_-ai、_-au或_-ad(用于插入/更新/删除之前/之后),是更合理的命名约定
后续行动
在插入表1
触发器后,可以在中执行UPDATE
语句。但是…UPDATE语句不能修改表1
中的任何行
存储的函数或触发器无法修改调用该函数或触发器的语句已在使用(用于读取或写入)的表
参考:您不需要update
语句,只需使用setnew.id=…
格式:
CREATE TRIGGER randomtriggername
BEFORE INSERT ON table1 FOR EACH ROW
SET NEW.id=COALESCE(NEW.id, NEW.age);
我将使用before触发器并使用coalesce()
函数返回第一个非空值。为什么不这样做“…在插入之前…当年龄为空时开始id=年龄结束那么你的意思是:在表1上插入后为每行创建触发器randomtriggername,当年龄为空时开始id=年龄结束与否?我以前想过。你已经知道年龄为空谢谢Spencer。我试图避免使用IF语句。这里可能吗?是的,可以在不使用IF语句的情况下重新编写。例如,SET NEW.id=IFNULL(NEW.id,NEW.age);
,或设置NEW.id=CASE WHEN NEW.id为NULL然后NEW.age ELSE NEW.id END;
我需要怎么做?你能给我一些提示吗?对于要分配给NEW.id的值,只需使用CASE表达式或从函数(如IFNULL或COALESCE)返回。当NEW.id为NULL时,表达式应返回NEW.age的值,否则,返回NEW.id的值。(使用此模式以避免触发器中出现IF
语句的首选项非常奇怪。)是否有对coalesce的替代?我试图避免使用IF语句和coalesce()函数。可以使用Ifnull()函数代替coalesce()。不过,如果能在原来的问题中提供这些限制,那就太好了。