首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个触发器中的多个操作,不起作用。

问一个触发器中的多个操作,不起作用。
EN

Stack Overflow用户
提问于 2014-02-28 14:08:56
回答 2查看 3.5K关注 0票数 0

伙计们!我想要在一个触发器中执行多个动作,但它不起作用。有人能帮忙吗?问题出在哪里?我的错误在哪里?请帮帮忙。

代码语言:javascript
复制
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

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2014-02-28 14:39:35

作为一个解决办法,我不会使用触发器!!只需修改您的设计并添加一个ON UPDATE CASCADE约束,这样就只需要一个操作,因为约束将完成其余的操作。有关更多细节,请查看此链接。

作为触发器选项

只有一个动作触发是可能的。以使其易于理解,例如:

代码语言:javascript
复制
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)
 );

创建第一个触发器:

代码语言:javascript
复制
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)

创建第二个触发器:

代码语言:javascript
复制
mysql> CREATE TRIGGER trigger2
    -> AFTER UPDATE
    -> ON actor
    -> FOR EACH ROW
    -> BEGIN
    ->   -- code
    -> END
    -> $$
Query OK, 0 rows affected (0.00 sec)

创建第三个动作triger :

代码语言:javascript
复制
mysql> CREATE TRIGGER trigger3
    -> AFTER DELETE
    -> ON actor
    -> FOR EACH ROW
    -> BEGIN
    ->   -- code
    -> END
    -> $$
DELIMITER ;Query OK, 0 rows affected (0.01 sec)

现在让我们尝试使用与第一个触发器相同的操作来创建一个Fort触发器

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-02-28 16:51:22

  1. 不要在多个触发器中分散删除用户的逻辑。这将使它更难维持。
  2. 只需在BEGIN ... END触发器中使用DELETE块,并在del_users中插入审计记录并从gallery中删除相关记录。不要忘记在mysql客户机中更改DELIMITER。
  3. 如果使用外键约束,则必须选择退出BEFORE事件作为触发器,因为必须在删除父记录之前删除子记录。

据说你的扳机看起来就像

代码语言:javascript
复制
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演示

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22097418

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档