2015-04-08 182 views
0

我正在研究MySQL數據庫並面臨創建觸發器的問題。 在數據庫中,假設有兩個表,「user」和「book」具有1對多關係,user_id是「book」表中的外鍵。我創建了一個觸發器,當刪除一本書時,它將「user」表中的「book_count」列減1。MySQL觸發器:錯誤#1442

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. 

我能理解錯誤是它試圖更新在用戶表中的一行大約是在第一次觸發刪除。那麼是否有任何解決方法,如果我想通過觸發器來實現?

+0

首先您使用查詢SHOW TRIGGERS LIKE'before_user_delete%'檢查其已存在或不存在 – Saty

+0

不,它不存在。 – Sultan

回答

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; 

正如你可以看到這是自動進行的護理你的觸發努力實現的目標。

+0

謝謝,我不知道它 – Sultan