【问题标题】:MySQL trigger: ERROR #1442MySQL 触发器:错误 #1442
【发布时间】:2015-04-08 10:17:53
【问题描述】:

我正在研究 MySQL 数据库并面临创建触发器的问题。 在数据库中,假设有两个表,“user”和“book”,具有一对多的关系,user_id 是“book”表中的外键。我创建了一个触发器,当一本书被删除时,它会将“user”表中的“book_count”列减少 1。

CREATE TRIGGER `after_book_delete` AFTER DELETE ON `book`
FOR EACH ROW BEGIN
UPDATE `user` SET `user`.book_count = `user`.book_count - 1 WHERE `user`.user_id = OLD.user_id;
END;

现在我想在删除用户时删除用户的所有书籍。我试过这个:

CREATE TRIGGER `before_user_delete` BEFORE DELETE ON `user`
FOR EACH ROW BEGIN
DELETE FROM `book` WHERE user_id = OLD.user_id;
END;

这将返回以下错误:

#1442 - Can't update table 'user' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

我可以理解错误是针对第一个触发器,它尝试更新用户表中即将删除的行。那么如果我想通过触发器来做,有什么解决方法吗?

【问题讨论】:

  • 首先你通过使用查询 SHOW TRIGGERS LIKE 'before_user_delete%' 来检查它是否已经存在
  • 不,它不存在。

标签: mysql mysql-error-1442


【解决方案1】:

book表中声明你的外键约束到user
 ON DELETE CASCADE ON UPDATE CASCADE

例如,

 CONSTRAINT fk_userbook FOREIGN KEY (id) REFERENCES user (id) ON DELETE CASCADE ON UPDATE CASCADE

那么如果你删除一个用户,所有相关的书籍也会被删除,从而否定了触发器的必要性。

扩展示例,

create table user (
     id int,
     constraint pk_user primary key(id)
) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

create table book (
     id int,
     uid int,
     bname varchar(10),
     constraint pk_book primary key(id),
     constraint fk_userbook foreign key (uid) references user (id) on update cascade on delete cascade
) CHARACTER SET utf8 COLLATE utf8_unicode_ci;

insert into user values(1);
insert into book values(1,1,"a");
insert into book values(2,1,"b");
insert into book values(3,1,"c");
insert into book values(4,1,"d");

delete from user where user.id = 1;
select * from book;

如您所见,这会自动处理您的触发器试图实现的目标。

【讨论】:

  • 谢谢,我不知道
猜你喜欢
  • 1970-01-01
  • 2017-08-12
  • 1970-01-01
  • 2019-11-15
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多