4

我已经搜索了所有可能的在线解决方案,但我无法找出此触发器中的错误。

    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

任何帮助将不胜感激,谢谢。

4

3 回答 3

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;;
于 2013-09-26T07:46:10.557 回答
2

它们只是触发器主体中的一条语句,因此无需使用 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`
于 2013-09-26T07:03:31.037 回答
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 ;
于 2013-09-26T10:09:16.353 回答