Wol*_*'08 0 mysql dependencies triggers sql-update
有人告诉我,我需要在触发器中使用分隔符.我正在查看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$
Run Code Online (Sandbox Code Playgroud)
老实说,我不知道如何做到这一点,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;
Run Code Online (Sandbox Code Playgroud)
在这个例子中没有解释的是如何odp和total_points重叠.我们怎样才能确定total_points表的points行是正确的points行?points表中的哪一行会更新MySQL?X//
那么,是否应该有一些方法来指定要更新的total_points.points行BEFORE INSERT ON odp?
第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);
Run Code Online (Sandbox Code Playgroud)
有多少国家?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);
Run Code Online (Sandbox Code Playgroud)
注意,当您的触发器没有BEGIN ... END子句时,可以省略分隔符.
第2部分
如果没有分隔符,语句将被解析为 -
CREATE PROCEDURE procedure1()
BEGIN
SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
Run Code Online (Sandbox Code Playgroud)
代替 -
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
Run Code Online (Sandbox Code Playgroud)