【问题标题】:IF Statement firing error in mysql triggermysql触发器中的IF语句触发错误
【发布时间】:2017-07-11 09:57:10
【问题描述】:

我正在执行此语句以使用 phpMyAdmin 在表上创建触发器

DELIMITER //
CREATE NEW TRIGGER credit_refs AFTER UPDATE on investments FOR EACH ROW 
BEGIN 
    DECLARE ref INT(20)
    DECLARE parent INT(20)
    DECLARE suparent INT(20)
    SELECT ref,ref_pa,ref_supa INTO ref,parent,suparent FROM users WHERE tid = OLD.tid;
        IF(ref != 0) THEN
        INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES           (ref,OLD.inv,'ref',OLD.tid);
    IF(parent != 0) THEN 
        INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES               (parent,OLD.inv,'ref_pa',OLD.tid);
    IF(suparent != 0) THEN 
        INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES                        (suparent,OLD.inv,'ref_supa',OLD.tid);
END //
DELIMITER ;

这句话在我看来没问题,但是我收到以下问候

错误

静态分析:

在分析过程中发现了 4 个错误。

无法识别的语句类型。 (靠近位置 253 的“IF”)

无法识别的语句类型。 (靠近位置 372 的“IF”)

无法识别的语句类型。 (靠近位置 505 的“IF”)

无法识别的语句类型。 (靠近位置 643 的“END”)

SQL 查询:文档

CREATE NEW TRIGGER credit_refs AFTER UPDATE on investments FOR EACH ROW BEGIN DECLARE ref INT(20) DECLARE parent INT(20) DECLARE suparent INT(20) SELECT ref,ref_pa,ref_supa INTO ref,parent,suparent FROM users WHERE tid = OLD.tid; IF(ref != 0) THEN INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES (ref,OLD.inv,'ref',OLD.tid); IF(parent != 0) THEN INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES (parent,OLD.inv,'ref_pa',OLD.tid); IF(suparent != 0) THEN INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES (suparent,OLD.inv,'ref_supa',OLD.tid); END

MySQL 说:文档

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在“NEW TRIGGER credit_refs AFTER UPDATE on investment FOR EACH ROW

附近使用正确的语法
 BEGIN
        DECL' at line 1

希望这里有人能够告诉我我在这里做错了什么。

【问题讨论】:

  • 我对mysql不太熟悉——但是你不需要在开头用@命名你声明的变量吗?
  • 我定义了用相同标准编写的触发器,所以没有。
  • @EstebanP。那是 ms sql 语法,而不是 MySQL。在 MySQL 中,以 @ 开头的变量是会话变量,其作用域和角色与触发器或任何其他存储例程中定义的变量完全不同。

标签: mysql sql syntax triggers declare


【解决方案1】:
DELIMITER $$
 CREATE TRIGGER credit_refs AFTER UPDATE ON investments
 FOR EACH ROW 
BEGIN
    DECLARE ref INT(20);
    DECLARE parent INT(20);
    DECLARE suparent INT(20);
    SELECT ref,ref_pa,ref_supa INTO ref,parent,suparent FROM users WHERE tid = OLD.tid;
        IF(ref != 0) THEN
        INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES           (ref,OLD.inv,'ref',OLD.tid);
        END IF;
    IF(parent != 0) THEN 
        INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES               (parent,OLD.inv,'ref_pa',OLD.tid);
        END IF;
    IF(suparent != 0) THEN 
        INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES                        (suparent,OLD.inv,'ref_supa',OLD.tid);
        END IF;
END;
 $$
DELIMITER ;

试试上面的查询。

在 MySQL 中,每个 IF 语句都必须有 END IF。对于多个 if 语句,您错过了 END IF

【讨论】:

  • “在 MySQL 中,每个 IF 语句都必须有 END IF”这不是真的 SELECT IF(1=1, 1, 0) 是一个有效的 MySQL 查询......但是我描述的 IF 函数是一个不同的 IF 语句.. IF声明主题开始使用确实需要END IF
  • 我将如何在 Begin 之后添加 IF 语句?如果更新字段的值为 1,我只需要运行查询,我尝试自己添加它,但遇到了语法错误。
  • @SagarGangwal 如果你能忍受我一会儿,我更改了语句并在声明变量后添加了另一个 IF 但我遇到了错误。这是声明,你能看一下吗?notey.it/n/MTJxeg
  • @HaiderAli 只需将== 删除到= 只需要单个=BEGIN DECLARE reff INT(20); DECLARE parent INT(20); DECLARE suparent INT(20); IF(NEW.confirmed = 1) THEN
  • @RaymondNijland 不要将 if() 函数与 if 语句混淆! MySQL 中的所有 if 语句都必须有一个对应的 end if。
【解决方案2】:

IF 周围的警告只是 phpmyadmin 自己的检查。您得到的语法错误是由 NEW 关键字引起的,不需要它。根据MySQL manual on creating triggers

CREATE
    [DEFINER = { user | CURRENT_USER }]
    TRIGGER trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    [trigger_order]
    trigger_body

但是,END IF 不会关闭您的 IF,而且您还缺少declare 语句末尾的分号。

【讨论】:

  • 你的意思是OLD关键字。因为我没有使用 NEW 关键字,并且没有 OLD 关键字,我将如何访问投资表中的值?
  • 很抱歉,我现在明白你的意思了。
猜你喜欢
  • 2015-06-02
  • 2013-05-28
  • 2012-04-13
  • 2020-09-12
  • 2013-01-28
  • 2021-10-23
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多