Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 插入行时如何更新触发器?_Mysql_Sql_Database - Fatal编程技术网

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

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

我有一个挑战:

创建将列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 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()。不过,如果能在原来的问题中提供这些限制,那就太好了。