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

MySQL:如何在触发器中使用分隔符?,mysql,triggers,dependencies,sql-update,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 table1xtab

有人告诉我需要在触发器中使用分隔符。我正在查看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$
老实说,我不知道如何做到这一点,而在的文档似乎是一个可怕的不足的参考。例如,当阅读有关“
旧的
”和“
新的
”时,它引用“
主题表
”——与触发器关联的表。有两个表与此触发器关联,我实际上正在尝试将更多表与此触发器关联。。。。查看示例代码时,
UPDATE
行影响表4,仅使用表4中的列(它们将值加1)。而且,他们正在使用
WHERE~a3=NEW.a1
。我不认为身份证是那样工作的。不应该有跨表工作的通用ID。为了适用性,他们应该在示例中使用相互依赖表

今天早些时候,我问了一个类似的问题,关于做这件事的好方法是什么,但现在我想知道,简单地说,是否有一种方法。感谢阅读。:)

下面是一个更新另一个表的触发器示例,但它似乎没有使用delimeter:

CREATE TRIGGER mytrigger BEFORE INSERT ON odp 
FOR EACH ROW
  UPDATE total_points SET points = points + NEW.points;
本例中没有解释的是
odp
total_points
如何重叠。我们如何确保
总分
表的
行是正确的
行?MySQL将更新
点表中的哪一行?x//

那么,在odp上插入之前,是否应该有某种方法来指定要更新的\u points.points总行中的哪一行?

运行:

delimiter $$
在运行
创建
之前,请运行:

delimiter $$

在运行
CREATE

之前,您在触发器内运行的更新查询与其他任何查询一样,只是它在触发器内运行。现在,您正在更新所有记录并增加points字段。如果要将其限制为仅与触发触发器的原因相关的特定记录,则必须将其添加到
UPDATE
query的
WHERE
子句中

MySQL已经知道了您使用
UPDATE
查询的意图,就像它不知道您在执行正常的插入/更新/删除操作时的真正含义一样,这取决于您指定必须执行的操作


在插入触发器的情况下,通常没有“旧”记录可供参考,因为您正在创建全新的内容(除非是重复密钥更新情况下的插入)

在触发器内运行的更新查询与其他任何查询一样,只是它在触发器内运行。现在,您正在更新所有记录并增加points字段。如果要将其限制为仅与触发触发器的原因相关的特定记录,则必须将其添加到
UPDATE
query的
WHERE
子句中

MySQL已经知道了您使用
UPDATE
查询的意图,就像它不知道您在执行正常的插入/更新/删除操作时的真正含义一样,这取决于您指定必须执行的操作


在插入触发器的情况下,通常没有“旧”记录可供参考,因为您正在创建全新的内容(除非是重复密钥更新情况下的插入)

第一部分

分隔符用于存储过程/函数、触发器或事件等源对象。所有这些对象在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过程语句。如您所见,CREATE过程也有一些内部语句;我们应该对MySQL客户端说,所有这些语句(在BEGIN…END中)都是一个语句的一部分;我们可以使用分隔符来完成此操作:

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子句时,可以省略分隔符


第二部分

如果没有分隔符,语句将被解析为-

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部分

分隔符用于存储过程/函数、触发器或事件等源对象。所有这些对象在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过程语句。如您所见,CREATE过程也有一些内部语句;我们应该对MySQL客户端说,所有这些语句(在BEGIN…END中)都是一个语句的一部分;我们可以使用分隔符来完成此操作:

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子句时,可以省略分隔符


第二部分

如果没有分隔符,语句将被解析为-

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

你能告诉我为什么这很重要吗?(你好像更改了代码)你的代码中有分号。您需要告诉MySQL这些分号并不能结束语句。您能告诉我为什么这很重要吗?(您似乎更改了代码)在您的创建中有分号。你需要告诉MySQL,这些分号并不代表语句的结尾。如果你有“开始”和“结束”,那又有什么关系呢?这似乎会产生分隔符unnecessary@Wolfpack'08,因为可以嵌套“开始-结束”块。MySQL不跟踪开始-结束嵌套计数。分隔符帮助客户机理解stat的位置