我在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 ;
答案 0 :(得分:3)
更改分隔符后,必须使用它而不是;
delimiter //
DROP TRIGGER IF EXISTS updtrigger_r4_balance_add; <--- use // instead
答案 1 :(得分:0)
在分隔符更改后,尝试替换语句
中的单词newr4c.reseller4_id = new.id;
大写一个。因为OLD和NEW是触发器的MySQL扩展,所以它们不区分大小写。
答案 2 :(得分:0)
MySQL使用;
来分隔查询。可以在单个请求中将多个查询发送到服务器;服务器使用当前分隔符(默认;
)将接收的文本拆分为查询。
有复杂的SQL构造(触发器,存储过程等),可能在其定义中包含一个或多个查询或BEGIN..END
复合语句。
因为这样的构造通常包含两个或多个查询,由通常的分隔符(;
分隔),MySQL需要一种方法来知道封闭的化合物构造的结束位置。
DELIMITER
语句用于在定义复合语句时将默认分隔符(;
)替换为不同的分隔符。这允许标准分隔符(;
)在复合语句的主体内使用。
它的工作原理如下:
DELIMITER
语句用于更改当前分隔符;相反,使用各种值作为分隔符。文档中建议使用//
,但也可以使用其他值。唯一的规则是使用未在复合语句中出现的字符(或字符序列)。;
)。;
分隔。DELIMITER ;
重置分隔符。如果接下来是另一个语句,则必须使用在步骤1中设置的分隔符终止DELIMITER
语句(因为它是当前分隔符;在解析并执行此语句后,新分隔符将生效)。您的问题的解决方案很简单:要么使用您设置的分隔符(//
)来分隔DROP TRIGGER
和CREATE 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 ;