【问题标题】:Compilation Error in MYSQL trigger?MYSQL 触发器中的编译错误?
【发布时间】:2012-11-20 16:59:35
【问题描述】:

表结构为:

mysql> DESC groups;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| PKey         | varchar(64)  | NO   | PRI | NULL    |       |
| group_name   | varchar(64)  | YES  |     | NULL    |       |
| Region       | varchar(128) | NO   |     | NULL    |       |
| Role         | varchar(128) | NO   |     | NULL    |       |
| parent_group | varchar(64)  | NO   | MUL | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

当我执行这个 Trigger 时,我遇到了编译错误

DELIMITER $$
CREATE
    TRIGGER `group_before_delete` BEFORE DELETE
    ON `groups`
    FOR EACH ROW BEGIN
    IF old.parent_group=old.PKey THEN
        UPDATE `Error: deletion RootGroup is prohibited!`;
    ELSE              
        UPDATE groups
        SET parent_group=old.parent_group
        WHERE parent_group=old.Pkey; 
    END IF;
    END$$
DELIMITER ;

ERROR 1064 (42000):您的 SQL 语法有错误; 检查与您的 MySQL 服务器版本相对应的手册 在 ';
附近使用正确的语法 其他
t_group=old.parent_group
t_group=old.PKey;
万一;'在第 6 行
mysql> 分隔符;


你能告诉我我在这里缺少什么吗??

【问题讨论】:

    标签: mysql sql rdbms database mysql-5.1


    【解决方案1】:

    您的代码中出现错误,因为您的 UPDATE statement 的语法无效。

    您提供的链接是 4 年和 5 年的! 由于SIGNAL 语句自version 5.5.0(3 年前发布)以来在 MySQL 中可用,因此使用这两个网页中描述的 hack 确实不是一个好主意。请改用SIGNAL statement

    注意:从 cmets 我们得知 OP 没有使用 MySQL 5.5,因此SIGNAL 不可用。

    【讨论】:

    • 我正在使用 5.5 之前的 MySQL 版本。所以信号处理不可能..谢谢回答!
    • 好的。下次记住(在相关时)在您的问题中包含您的 MySQL 服务器的版本。
    【解决方案2】:

    在您的 IF 语句中,以下不是有效的 SQL 语句:

    UPDATE `Error: deletion RootGroup is prohibited!`;
    

    应该是这样的:

    IF old.parent_group=old.PKey THEN
        UPDATE `Error: deletion RootGroup is prohibited!` set x=1;
    ELSE              
        UPDATE groups
        SET parent_group=old.parent_group
        WHERE parent_group=old.PKey; 
    END IF;
    

    我从来没有这样做过。这是一种丑陋的做法。但如果它有效,那又是什么鬼。

    【讨论】:

    • 我从这里学到的:devshed.com/c/a/MySQL/…
    • 这里也是:stackoverflow.com/questions/24/… 在 el.atomo 先生的回答中
    • 你复制粘贴的时候不够仔细。我更新了我的答案。
    • 只是为了做一个有效的SQL语句。基本上它只是为了抛出错误而设计的。下表不存在:Error: deletion RootGroup is prohibited!, 'x' 将是该表中的一个字段,但显然它也不存在。您只需要该元素来生成有效的 SQL 语句。如:UPDATE SET = 1;
    • @user1705796 这确实不是正确的做法。阅读我的答案。
    猜你喜欢
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2014-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多