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

时间:2011-11-16 15:29:30

标签: mysql triggers dependencies 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$

老实说,我不知道如何做到这一点,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行? MySQL会更新points表中的哪一行? X //

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

3 个答案:

答案 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触发器的情况下,通常没有“旧”记录可供参考,因为您正在创建一些全新的东西(除非它是插入...复制密钥更新情况)。

相关问题