【问题标题】:Setting up a trigger in PHPMyAdmin在 PHPMyAdmin 中设置触发器
【发布时间】:2013-05-16 12:29:52
【问题描述】:

我正在尝试理解触发器,并且我认为我完全理解它们,但我无法实现它们中的任何一个。我希望此代码删除名为“test”的用户。所以如果有人更新他们的名字来“测试”这个用户应该被删除。

我的示例代码:

CREATE TRIGGER `my_trigger`
BEFORE UPDATE ON `my_db` FOR EACH ROW
BEGIN
DELETE FROM my_table WHERE `username` = 'test';
END

我的错误:

#1064 - 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 '' at line 4 

我不明白为什么 delete 语句给了我一个错误。有什么想法吗?

【问题讨论】:

  • 你不能这样做(见下面的答案)。但是你可以创建一个存储过程,更新表,然后从表中删除行(使用事务)。

标签: mysql sql triggers phpmyadmin


【解决方案1】:

只能将触发器与表关联。

同样在存储函数或触发器中,不允许修改已被调用函数或触发器的语句使用(用于读取或写入)的表。

Restrictions on Stored Programs

【讨论】:

    【解决方案2】:

    这是语法正确的 SQL:

    DELIMITER ;
    DROP TRIGGER IF EXISTS `my_trigger`;
    DELIMITER $$
    CREATE TRIGGER `my_trigger`
    BEFORE UPDATE ON `my_table` FOR EACH ROW
    BEGIN
        DELETE FROM my_table WHERE `username` = 'test';
    END$$
    DELIMITER;
    

    但它不起作用,因为你不能从表中删除,你正在更新:

    触发器可以访问自己表中的旧数据和新数据。触发器 也可以影响其他表,但不允许修改 已被(用于读取或写入)的表 调用函数或触发器的语句。

    http://dev.mysql.com/doc/refman/5.5/en/faqs-triggers.html#qandaitem-B-5-1-9

    如果你想要一个简单的例子,试试这个:

    DELIMITER ;
    DROP TRIGGER IF EXISTS `my_trigger`;
    DELIMITER $$
    CREATE TRIGGER `my_trigger`
    BEFORE UPDATE ON `my_table` FOR EACH ROW
    BEGIN
        SET NEW.`username` = 'aaa';
    END$$
    DELIMITER;
    

    这将在更新时始终将“aaa”设置为用户名。

    【讨论】:

    • 我不确定我是否理解你为什么在上面写了DELIMITER。所有的示例/教程都没有。你能详细说明一下吗?
    • @EGHDK 需要更改分隔符,因为 MySQL 看到的是第一个“;”作为 CREATE TRIGGER 语句的结尾。 stackoverflow.com/questions/1346637/…
    猜你喜欢
    • 2015-08-24
    • 2017-09-06
    • 2018-03-04
    • 2011-05-19
    • 2014-09-17
    • 2015-10-14
    • 2017-08-27
    • 2014-02-02
    相关资源
    最近更新 更多