家伙! 我想在一个触发器中执行多个操作但它不起作用。 有人可以帮忙吗? 问题出在哪儿? 我的错误在哪里? 请帮忙。
DROP TRIGGER IF EXISTS `usertrigger` ;
CREATE DEFINER = `cmsbalti`@`localhost` TRIGGER `usertrigger`
BEFORE DELETE ON `users`
FOR EACH ROW
INSERT INTO `del_users` (fullname)
VALUES (old.fullname)
BEFORE INSERT ON `del_users` FOR EACH ROW
BEGIN
DELETE FROM `gallery`
WHERE uid = old.id;
END
谢谢。
答案 0 :(得分:0)
作为解决方法,我不会使用触发器!!只需更改您的设计并添加ON UPDATE CASCADE
约束,因此只需要一个操作,因为约束将完成其余操作。查看此link了解详情。
至于触发选项
只能有一个动作触发器。 为了便于理解,请参阅示例:
mysql> CREATE TABLE actor(
actor_id SMALLINT(5) UNSIGNED NOT NULL AUTO_INCREMENT,
first_name VARCHAR(45) NOT NULL,
last_name VARCHAR(45) NOT NULL,
last_update TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (actor_id),
INDEX idx_actor_last_name (last_name)
);
创建第一个触发器:
mysql> DELIMITER $$
mysql>
mysql> CREATE TRIGGER trigger1
-> AFTER INSERT
-> ON actor
-> FOR EACH ROW
-> BEGIN
-> -- code
-> END
-> $$
Query OK, 0 rows affected (0.00 sec)
创建第二个触发器:
mysql> CREATE TRIGGER trigger2
-> AFTER UPDATE
-> ON actor
-> FOR EACH ROW
-> BEGIN
-> -- code
-> END
-> $$
Query OK, 0 rows affected (0.00 sec)
创建第三个动作组合:
mysql> CREATE TRIGGER trigger3
-> AFTER DELETE
-> ON actor
-> FOR EACH ROW
-> BEGIN
-> -- code
-> END
-> $$
DELIMITER ;Query OK, 0 rows affected (0.01 sec)
现在让我们尝试使用与第一个触发器相同的动作创建堡垒触发器
mysql> CREATE TRIGGER trigger11
-> AFTER INSERT
-> ON actor
-> FOR EACH ROW
-> BEGIN
-> -- code
-> END
-> $$
ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'
故事结束 - 你不能按照你写的方式创建触发器 - 制作两个不同的触发器,因为平均值不同。
所以我的建议是在该表上创建两个触发器,并确保将它们放在块中以避免执行级别的问题(几乎没有机会)。
答案 1 :(得分:0)
BEGIN ... END
触发器中使用DELETE
块,然后在del_users
中插入审核记录并从gallery
删除相关记录。 不要忘记在mysql客户端中更改DELIMITER
。 BEFORE
事件,因为您必须在删除父级之前删除子记录。据说你的触发器可能看起来像
DELIMITER //
CREATE TRIGGER tg_ad_users
BEFORE DELETE ON users
FOR EACH ROW
BEGIN
INSERT INTO del_users (user_id, fullname, deleted)
VALUES (OLD.id, OLD.fullname, NOW());
DELETE FROM gallery
WHERE uid = OLD.id;
END//
DELIMITER ;
这是 SQLFiddle 演示