【问题标题】:Trigger Syntax Error in MySQL on IF/THEN (ERROR 1064)在 IF/THEN 上触发 MySQL 中的语法错误(错误 1064)
【发布时间】:2012-10-16 03:30:59
【问题描述】:

执行此查询时出错:

CREATE TRIGGER insert_Topics
  BEFORE INSERT
  ON Topics
  FOR EACH ROW
  BEGIN
    IF (SELECT COUNT(*) FROM Subjects WHERE ID=new.SubjectID)=0
    THEN
      INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
END IF;
END;
delimiter ;

错误提示:

1064 - 您的 SQL 语法有错误;检查手册 对应于您的 MySQL 服务器版本,以便使用正确的语法 在第 8 行的 '' 附近

它指向单词 THEN

有什么帮助吗?提前致谢。

【问题讨论】:

    标签: mysql if-statement


    【解决方案1】:

    两者

    CREATE TRIGGER insert_Topics
    BEFORE INSERT
    ON Topics
    FOR EACH ROW
    BEGIN
      IF NOT EXISTS(SELECT 1 FROM Subjects WHERE ID=NEW.SubjectID LIMIT 1) THEN
        INSERT INTO error_msg VALUES ('Foreign Key Constraint Violated!');
      END IF;
    END;
    

    CREATE TRIGGER insert_Topics
    BEFORE INSERT
    ON Topics
    FOR EACH ROW
    BEGIN
      IF (SELECT 1 FROM Subjects WHERE ID=NEW.SubjectID LIMIT 1) IS NULL THEN
        INSERT INTO error_msg VALUES ('Foreign Key Constraint Violated!');
      END IF;
    END;
    

    为我工作,所以你的语法问题可能在别处。

    【讨论】:

    • 感谢您的帮助,但这又产生了另一个错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 6 行的 '' 附近使用正确的语法,它指向选择语句
    • new 更改为 NEW 并添加 LIMIT 1 看看是否解决了您的问题。
    • 语法很好,所以问题出在其他地方。您使用的是什么版本的 MySQL?触发器对我来说很好,在 MySQL 5.5.27 上。尝试注释掉 SELECT 语句,看看是否能解决问题。
    • 看来是这样。我正在研究 dot5hosting MySQL,它的版本是 5.0.9。非常感谢
    【解决方案2】:

    我知道这是一个老问题,但我想我会分享我对错误的看法,以防将来有人看到这个问题(如果我犯了任何错误,请随时进行社区编辑!)。

    原始问题中出现问题的原因似乎与使用 DELIMITER 以及它的作用有关,如下所述:What does DELIMITER // do in a Trigger?

    在给定的代码中:

            INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
    END IF;
    END;
    delimiter ;
    

    用“delimiter ;”重置分隔符表示它之前已更改为另一个分隔符,例如:

    DELIMITER //
    --TRIGGER1
    --TRIGGER2
    --TRIGGERn
    delimiter ; -- Aggravates me that this wasn't capitalised :P
    

    将分隔符设置为“//”(或其他)的原因是允许分隔多个语句,我的想法是原作者在该触发器之上还有其他触发器,并且已将分隔符更改为“//”之类的内容,但忘记更改:

    END IF;
    END;
    delimiter ;
    

    收件人:

    END IF;
    END//
    delimiter ;
    

    因此,评论者无法复制的原因是因为他们设置了正确的分隔符(“;”),并且由于只有一个语句要分隔,所以没有发现任何错误,作为作者做过。 请参阅以下测试代码和结果,包括初始化,作为一些证明:

    DELIMITER ; -- Just in case
    DROP TABLE IF EXISTS Topics, Subjects, error_msg;
    
    CREATE TABLE Subjects ( id INT(5) PRIMARY KEY,
                            subjectname CHAR(20));
    CREATE TABLE Topics ( topicname CHAR(20),
                          subjectID INT(5)
                        # FOREIGN KEY (subjectID) REFERENCES Subjects(id) - How this check should be done...
                        );
    CREATE TABLE error_msg ( Message VARCHAR(50) );
    
    INSERT INTO Subjects VALUES
        ('5', 'Arts'),
        ('55', 'Maths'),
        ('2342', 'Biology'),
        ('12345', 'Finance');
    
    DELIMITER $$ -- Where the delimiter would be defined, originally 
        CREATE TRIGGER InsertOnTopics
            BEFORE INSERT ON Topics
            FOR EACH ROW
            BEGIN
                IF (SELECT COUNT(*) FROM Subjects WHERE id=NEW.subjectID)=0 THEN
                    INSERT error_msg VALUES ('Foreign Key Constraint Violated!');
                END IF;
            END$$
    DELIMITER ;
    
    INSERT INTO Topics VALUES
        ('Welfare Benefits', '5'),
        ('Eigenvectors', '55'),
        ('Mitochondria', '2342'),
        ('Bank of Dad', '12345'),
        ('Something else', '555');
    
    SELECT * FROM error_msg;
    

    以“end;”为原代码:

    mysql> SOURCE /Users/benpalmer/test.sql
    Query OK, 0 rows affected (0.00 sec)
    
    Query OK, 0 rows affected (0.02 sec)
    
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 0 rows affected (0.02 sec)
    
    Query OK, 4 rows affected (0.00 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    Query OK, 0 rows affected (0.02 sec)
    
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '('Something else', '555')' at line 6
    Empty set (0.00 sec)
    
    mysql>
    

    在我的代码中使用“END$$”:

    mysql> SOURCE /Users/myUsername/test.sql
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 0 rows affected (0.02 sec)
    
    Query OK, 0 rows affected (0.02 sec)
    
    Query OK, 4 rows affected (0.00 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    Query OK, 0 rows affected (0.02 sec)
    
    Query OK, 5 rows affected (0.01 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    
    +----------------------------------+
    | Message                          |
    +----------------------------------+
    | Foreign Key Constraint Violated! |
    +----------------------------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    除此之外,我不明白为什么这个特定示例没有使用适当的外键约束来完成。作为我的第一个答案......希望这对任何人都有帮助!也卡在这上面了一段时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 2015-11-09
      • 2015-06-02
      • 2015-04-25
      • 1970-01-01
      • 2018-03-18
      相关资源
      最近更新 更多