0

我正在研究 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.

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

4

1 回答 1

2

userbook表中声明您的外键约束

 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;

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

于 2015-04-08T10:27:29.690 回答