MySQL:如何在触发器中使用分隔符?

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)

在这个例子中没有解释的是如何odptotal_points重叠.我们怎样才能确定total_points表的points行是正确的points行?points表中的哪一行会更新MySQL?X//

那么,是否应该有一些方法来指定要更新的total_points.points行BEFORE INSERT ON odp

Dev*_*art 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);
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)