一个触发器中的多个动作,而不是工作

时间:2014-02-28 14:08:56

标签: mysql sql triggers phpmyadmin

家伙! 我想在一个触发器中执行多个操作但它不起作用。 有人可以帮忙吗? 问题出在哪儿? 我的错误在哪里? 请帮忙。

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

谢谢。

2 个答案:

答案 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)

  1. 不要分散跨多个触发器删除用户的逻辑。这将使维护变得更加困难。
  2. 只需在BEGIN ... END触发器中使用DELETE块,然后在del_users中插入审核记录并从gallery删除相关记录。 不要忘记在mysql客户端中更改DELIMITER
  3. 如果您正在使用外键约束,则必须为触发器选择退出BEFORE事件,因为您必须在删除父级之前删除子记录。
  4. 据说你的触发器可能看起来像

    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 演示