gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:23:53 25 4
gpt4 key购买 nike

有人告诉我需要在触发器中使用定界符。我正在查看 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”——与触发器关联的表.有两个表与此触发器相关联,我实际上试图将更多表与此触发器相关联...。在查看示例代码时,影响表 4 的 UPDATE 行仅影响列在 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//

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

最佳答案

第 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 内)都是一个语句的一部分;我们可以在定界符的帮助下做到这一点:

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

关于MySQL:如何在触发器中使用定界符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8154158/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com