2014-12-22 163 views
0

1個作者可以有很多書籍/ 1本書可以有多個作者MySQL的觸發器:刪除間接相關條目

enter image description here

作者被刪除,我是如何引發的MySQL(SQLite的)刪除書籍作者只是唯一被刪除的作者作者,所以它不會有沒有作者關聯的書嗎?

例子:

BOOK1: John & Paul 
BOOK2: John 
BOOK3: Lucy 
BOOK4: John & Lucy 

,如果我從作者刪除約翰則觸發只會刪除BOOK2。

authors_books'外國鍵:ON DELETE CASCADE

回答

0

我寫了這個簡單的觸發器。完美作品:

PRAGMA primary_keys = ON; 
PRAGMA foreign_keys = ON; 

CREATE TRIGGER DEL_BOOKS BEFORE DELETE ON authors_books 
WHEN 

(SELECT COUNT(*) FROM authors_books WHERE 
    fk_book_id = OLD.fk_book_id AND fk_author_id != OLD.fk_author_id) = 0 

BEGIN 

    DELETE FROM books WHERE books.book_id = OLD.fk_book_id; 

END; 
0

如果你需要純trigger解決方案則考慮以下

mysql> create table authors (author_id int , name varchar(100)); 
Query OK, 0 rows affected (0.13 sec) 

mysql> create table books (book_id int, title varchar(100)); 
Query OK, 0 rows affected (0.17 sec) 

mysql> create table authors_books (fk_author_id int,fk_book_id int); 
Query OK, 0 rows affected (0.13 sec) 

mysql> insert into authors values (1,'A'),(2,'B'),(3,'C'); 
Query OK, 3 rows affected (0.05 sec) 
Records: 3 Duplicates: 0 Warnings: 0 

mysql> insert into books values (1,'book1'),(2,'book2'),(3,'book3'),(4,'book4'); 
Query OK, 4 rows affected (0.04 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> insert into authors_books values (1,1),(2,1),(3,2),(1,3),(1,4),(3,4); 
Query OK, 6 rows affected (0.04 sec) 
Records: 6 Duplicates: 0 Warnings: 0 

讓寫觸發器現在

delimiter // 
create trigger auth_delete after delete on authors 
for each row 
begin 
delete b from books b 
join authors_books ab on ab.fk_book_id = b.book_id 
where ab.fk_author_id = old.author_id 
and not exists (
    select 1 from authors_books ab1 
    where b.book_id = ab1.fk_book_id 
    and ab1.fk_author_id <> ab.fk_author_id 
); 

    delete from authors_books where fk_author_id = old.author_id ; 
end;// 

delimiter ; 

在上面的代碼我同時刪除正在刪除作者的行authors_books

測試::

mysql> delete from authors where author_id = 1 ; 
Query OK, 1 row affected (0.05 sec) 

mysql> select * from authors_books ; 
+--------------+------------+ 
| fk_author_id | fk_book_id | 
+--------------+------------+ 
|   2 |   1 | 
|   3 |   2 | 
|   3 |   4 | 
+--------------+------------+ 
3 rows in set (0.00 sec) 

mysql> select * from books ; 
+---------+-------+ 
| book_id | title | 
+---------+-------+ 
|  1 | book1 | 
|  2 | book2 | 
|  4 | book4 | 
+---------+-------+ 
3 rows in set (0.00 sec) 
+0

整潔的代碼!謝謝。有沒有更好的方法來設計這個場景,所以我不必使用觸發器? (而不是'ON DELETE CASCADE') – Azevedo

+0

問題是關係是'一對多',使用'on delete cascade'會刪除所有子記錄。因此,如果刪除author = 1,然後使用on刪除級聯,它將用於'authors_books'目的,但刪除您仍需編寫自定義查詢的書籍。不知道是否可以使用約束來完成。 –