有人告诉我,我需要在触发器中使用定界符。我正在查看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。
old
new
subject table
UPDATE
WHERE ~ a3 = NEW.a1
实际上,我今天早些时候曾问过类似的问题,这将是一个好的方法,但是现在,我很想知道是否有一种方法。谢谢阅读。:)
这是一个更新另一个表的触发器的示例,但似乎没有使用定界符:
CREATE TRIGGER mytrigger BEFORE INSERT ON odp FOR EACH ROW UPDATE total_points SET points = points + NEW.points;
什么在这个例子中没有解释是怎么odp和total_points重叠。我们如何确定total_points表格的points行是正确的points行?pointsMySQL将更新表中的哪一行?X//
odp
total_points
points
因此,是否应该采用某种方法来指定要更新的total_points.points行中的哪些BEFORE INSERT ON odp?
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内部)-是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