MySQL触发器中出现意外的END_OF_INPUT

时间:2013-09-25 18:51:24

标签: mysql mysql-workbench mysql-error-1064

我搜索了所有可能的在线解决方案,但我无法弄清楚此触发器中的错误。

    CREATE TRIGGER `delete_neat_link`
    AFTER DELETE ON `neat_urls`
    FOR EACH ROW 
    BEGIN
        DELETE FROM `css_paths` 
            WHERE `css_paths`.`path_id` = OLD.`neat_link`;
    END;

第一个错误出现在 OLD。neat_link

    syntax error, unexpected END_OF_INPUT, expecting ';'

,第二个在 END;

    syntax error, unexpected END

任何帮助都会很明显,谢谢。

3 个答案:

答案 0 :(得分:5)

这个问题是由于解释个别陈述。 CREATE TRIGGER语句就是这样一个完整的语句,必须按原样发送给服务器。通常语句边框由默认分隔符(分号)识别。但是在存储程序的情况下,需要使用分号来分隔内部语句。这会使客户端感到困惑,因为它无法区分存储程序的内部语句或完整语句,因为它必须作为一个整体发送到服务器。

因此引入了DELIMITER语句,该语句仅适用于客户端(不是服务器,服务器本身无法解析此语句)。它将默认分隔符更改为您选择的一个,从而使客户端在哪里查找语句的结尾。因此典型案例如下:

DELIMITER ;;
CREATE TRIGGER `ins_film` AFTER INSERT ON `film` FOR EACH ROW BEGIN
    INSERT INTO film_text (film_id, title, description)
        VALUES (new.film_id, new.title, new.description);
  END;;

答案 1 :(得分:2)

它们只是Trigger主体中的一个语句,因此不需要使用BEGIN-END复合语句构造。试试这个:

CREATE TRIGGER `delete_neat_link`
AFTER DELETE ON `neat_urls`
FOR EACH ROW 
    DELETE FROM `css_paths` 
    WHERE `css_paths`.`path_id` = OLD.`neat_link`

答案 2 :(得分:2)

另一种可能的解决方案

DELIMITER $$ 

CREATE TRIGGER `delete_neat_link` 
AFTER DELETE ON `neat_urls` 
FOR EACH ROW
     BEGIN 
          DELETE FROM `css_paths` 
          WHERE `css_paths`.`path_id` = OLD.`neat_link`;
     END$$

DELIMITER ;