有人告诉我,我需要在触发器中使用分隔符。我正在查看MySQL手册页,我在示例中找到了它;但是,它不在通用文档中。
以下是我要纠正的代码:
CREATE TRIGGER adult BEFORE INSERT OR UPDATE ON table5.column5
FOR EACH ROW BEGIN
UPDATE table1 SET column5 = table5.column5 WHERE table5id = table1xtable5.table5id WHERE table1xtable5.table1id = OLD.table1.id$
END$
老实说,我不知道如何做到这一点,http://dev.mysql.com/doc/refman/5.5/en/create-trigger.html上的文档似乎是一个非常不充分的参考。例如,在阅读“old
”和“new
”时,它会引用“subject table
” - 与触发器关联的表格。有两个与此触发器关联的表,我实际上是尝试将更多表与此触发器关联....当查看示例代码时,UPDATE
行(影响table4),只有table4中的列是使用(他们将值加1)。此外,他们正在使用WHERE ~ a3 = NEW.a1
。我不认为id的工作方式。不应该有跨表的通用ID。对于适用性,他们肯定应该在示例中使用相互依赖表。
我实际上在今天早些时候问了一个类似的问题,关于这样做的好方法是什么,但现在我很想知道,如果有方法的话。谢谢阅读。 :)
以下是更新另一个表的触发器示例,但它似乎没有使用分隔符:
CREATE TRIGGER mytrigger BEFORE INSERT ON odp
FOR EACH ROW
UPDATE total_points SET points = points + NEW.points;
此示例中未说明的是odp
和total_points
重叠的方式。我们如何确保total_points
表的points
行是正确的points
行? MySQL会更新points
表中的哪一行? X //
那么,是否应该有一些方法来指定要更新BEFORE INSERT ON odp
的total_points.points行中的哪一行?
答案 0 :(得分:5)
第1部分
分隔符用于源对象,如存储过程/函数,触发器或事件。所有这些对象都可能在BEGIN ... END子句中有一个正文代码。
MySQL脚本中的所有语句都应以分隔符结束,默认为“;”。但是,如果源对象具有包含某些语句的主体,该怎么办,例如:
INSERT INTO table1 VALUES(1);
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
PREPARE stmt2 FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
END;
INSERT INTO table1 VALUES(2);
有多少州长? 3或8?答案是三,因为脚本有两个INSERT和一个CREATE PROCEDURE语句。如您所见,CREATE PROCEDURE也有一些内部陈述;我们应该对MySQL客户说,所有这些语句(在BEGIN ... END内) - 都是ONE语句的一部分;我们可以在分隔符的帮助下完成:
INSERT INTO table1 VALUES(1);
DELIMITER $$
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
PREPARE stmt2 FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
END$$
DELIMITER ;
INSERT INTO table1 VALUES(2);
注意,当你的触发器没有BEGIN ... END子句时,可以省略分隔符。
第2部分
如果没有分隔符,语句将被解析为 -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
而不是 -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
PREPARE stmt2 FROM @s;
SET @a = 6;
SET @b = 8;
EXECUTE stmt2 USING @a, @b;
END
答案 1 :(得分:0)
运行:
delimiter $$
在运行CREATE
答案 2 :(得分:0)
您在触发器内运行的UPDATE查询是一个与其他任何查询一样的更新查询,除了它在触发器中运行。现在,您正在更新所有记录并增加点数字段。如果要将其限制为仅与触发触发器的任何内容相关的特定记录,则必须将其添加到UPDATE
查询的WHERE
子句中。
MySQL已经知道您对UPDATE
查询的意图是什么,就像它不知道在进行正常的插入/更新/删除时你的真正含义一样 - 由你来确定完成。
在INSERT触发器的情况下,通常没有“旧”记录可供参考,因为您正在创建一些全新的东西(除非它是插入...复制密钥更新情况)。