0

私は MySQL データベースに取り組んでおり、トリガーを作成する際に問題に直面しています。データベースに、1 対多の関係を持つ "user" と "book" の 2 つのテーブルがあり、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

テーブルでuser外部キー制約を宣言しますbook

 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 に答える