2

我正在尝试理解触发器,我想我完全理解它们,但我无法实现它们中的任何一个。我希望此代码删除名为“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 语句给了我一个错误。有任何想法吗?

4

2 回答 2

1

这是语法正确的 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”设置为用户名。

于 2013-05-21T16:56:29.800 回答
0

可以仅将触发器与表关联。

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

存储程序的限制

于 2013-05-21T16:43:22.077 回答