一尘不染

MySQL:如何在触发器中使用定界符?

mysql

有人告诉我,我需要在触发器中使用定界符。我正在查看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;

什么在这个例子中没有解释是怎么odptotal_points重叠。我们如何确定total_points表格的points行是正确的points行?pointsMySQL将更新表中的哪一行?X//

因此,是否应该采用某种方法来指定要更新的total_points.points行中的哪些BEFORE INSERT ON odp


阅读 316

收藏
2020-05-17

共1个答案

一尘不染

第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
2020-05-17