MySQL:如何在触发器中使用分隔符?
有人告诉我需要在触发器中使用分隔符。我正在查看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
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的位置