当前位置: 首页 > 面试题库 >

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

澹台玉石
2023-03-14
问题内容

有人告诉我,我需要在触发器中使用定界符。我正在查看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行?pointsMySQL将更新表中的哪一行?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内部)-是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


 类似资料:
  • 问题内容: 我正在尝试使用MySQL触发器生成错误消息。下面是我的代码: 但这总是会产生错误。我不知道错误是什么,因为它没有说任何有关错误的信息,而只是“错误”。 有什么建议吗?除此之外,有人说使用存在问题,因为它可能取决于MySQL版本。有什么建议吗? 问题答案: 该子句是信号语法的一部分-它们之间不应存在分号()。此外,它使用运算符,而不是:

  • 本文向大家介绍MySQL如何创建触发器,包括了MySQL如何创建触发器的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了MySQL创建触发器的具体代码,供大家参考,具体内容如下 先来个实例: 实例解析:   先创建触发器中待存储的表t_attendance   DELIMITER $   意思是告诉mysql下文执行语句以“$”结束,如果没有这句,下面语句会出错,mysql无法判断哪句

  • 本文向大家介绍MySQL触发器使用详解,包括了MySQL触发器使用详解的使用技巧和注意事项,需要的朋友参考一下 MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。 创建触发器 在MySQL中,创建触发器语法如下: 其中: trigger_name:标识触发器名称,用户自行指定; trigger_t

  • 本文向大家介绍Oracle使用触发器和mysql中使用触发器的案例比较,包括了Oracle使用触发器和mysql中使用触发器的案例比较的使用技巧和注意事项,需要的朋友参考一下 一、触发器   1.触发器在数据库里以独立的对象存储,   2.触发器不需要调用,它由一个事件来触发运行   3.触发器不能接收参数   --触发器的应用     举个例子:校内网、开心网、facebook,当你发一个日志,

  • 问题内容: 我有一个顾客。 当将新行添加到此客户表时,如果新行的(主键)已经在客户表中,则我想使用其他字段对现有(旧)行进行更新。()。 否则(如果不在表中)插入新行。我知道我可以使用触发器在mssql中做到这一点。有没有一种方法可以在mysql中做到这一点。 问题答案: MySQL没有触发器,但是它具有REPLACE和INSERT … ON DUPLICATE KEY UPDATE (请参阅文档

  • 我试图在插入后创建一个触发器,它将更新另一个表。 这是我尝试的代码: 但我会收到以下错误消息: 1064-您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,了解使用“@qte AS integer”附近的正确语法;声明@code为整数;从INSERTED中选择@QTE=qteInv;%s“位于第4行