用于正确语法的MySQL版本

时间:2017-02-05 19:34:16

标签: mysql sql

我在SQL架构上收到此错误。我得到的错误信息是

  

”   您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   在UPDATE ON后'CREATE TRIGGER updtrigger_r4_balance'附近   经销商4 FOR EACH R'在第2行“

哪种语法出错?我附加了2个SQL架构。两者都有同样的问题。

delimiter // DROP TRIGGER IF EXISTS updtrigger_r4_balance;
CREATE TRIGGER updtrigger_r4_balance AFTER 
UPDATE
   ON resellers4 FOR EACH ROW 
   BEGIN
      IF NEW.callsLimit <= 0 
   THEN
      UPDATE
         resellers4_child r4c 
         INNER JOIN
            resellers3 r3 
            ON (r4c.reseller3_id = r3.id) 
      SET
         r4c.reseller3_callsLimit = r4c.reseller3_callsLimit + r3.callsLimit, r3.callsLimit = 0 
      WHERE
         r4c.reseller4_id = new.id;
   END
   IF;
END
// delimiter ;

另一个是:

delimiter //
DROP TRIGGER
IF EXISTS updtrigger_r4_balance_add;

CREATE TRIGGER updtrigger_r4_balance_add BEFORE UPDATE ON resellers4 FOR EACH ROW
BEGIN

IF OLD.callsLimit <= 0 THEN

    UPDATE resellers3 r3
    INNER JOIN resellers4_child r4c ON (r4c.reseller3_id=r3.id) 
    SET
                r3.callsLimit = r3.callsLimit+r4c.reseller3_callsLimit,
                r4c.reseller3_callsLimit = 0

    WHERE r4c.reseller4_id=new.id;

END IF;

END
//
delimiter ;

3 个答案:

答案 0 :(得分:3)

更改分隔符后,必须使用它而不是;

delimiter //
DROP TRIGGER IF EXISTS updtrigger_r4_balance_add; <--- use // instead

答案 1 :(得分:0)

在分隔符更改后,尝试替换语句

中的单词new
r4c.reseller4_id = new.id;

大写一个。因为OLD和NEW是触发器的MySQL扩展,所以它们不区分大小写。

答案 2 :(得分:0)

MySQL使用;来分隔查询。可以在单个请求中将多个查询发送到服务器;服务器使用当前分隔符(默认;)将接收的文本拆分为查询。

有复杂的SQL构造(触发器,存储过程等),可能在其定义中包含一个或多个查询或BEGIN..END复合语句。

因为这样的构造通常包含两个或多个查询,由通常的分隔符(;分隔),MySQL需要一种方法来知道封闭的化合物构造的结束位置。

DELIMITER语句用于在定义复合语句时将默认分隔符(;)替换为不同的分隔符。这允许标准分隔符(;)在复合语句的主体内使用。

它的工作原理如下:

  1. DELIMITER语句用于更改当前分隔符;相反,使用各种值作为分隔符。文档中建议使用//,但也可以使用其他值。唯一的规则是使用未在复合语句中出现的字符(或字符序列)。
  2. 从现在开始,所有后续查询都必须以新分隔符结束(而不是;)。
  3. 声明复杂的构造(无论是触发器,事件的存储过程)。如果它包含多个语句,则必须用;分隔。
  4. 使用在步骤1中声明的分隔符结束复杂构造。
  5. 使用DELIMITER ;重置分隔符。如果接下来是另一个语句,则必须使用在步骤1中设置的分隔符终止DELIMITER语句(因为它是当前分隔符;在解析并执行此语句后,新分隔符将生效)。
  6. 您的问题的解决方案很简单:要么使用您设置的分隔符(//)来分隔DROP TRIGGERCREATE TRIGGER语句:

    delimiter //
    
    DROP TRIGGER
    IF EXISTS updtrigger_r4_balance_add //
    
    CREATE TRIGGER updtrigger_r4_balance_add BEFORE UPDATE ON resellers4 FOR EACH ROW
    BEGIN
        ...
    END
    //
    delimiter ;
    

    或者您在DROP TRIGGER语句之前移动DELIMITER语句并保持原样(以;终止):

    DROP TRIGGER
    IF EXISTS updtrigger_r4_balance_add;
    
    delimiter //
    
    CREATE TRIGGER updtrigger_r4_balance_add BEFORE UPDATE ON resellers4 FOR EACH ROW
    BEGIN
        ...
    END
    //
    delimiter ;