1個作者可以有很多書籍/ 1本書可以有多個作者MySQL的觸發器:刪除間接相關條目
當作者被刪除,我是如何引發的MySQL(SQLite的)刪除書籍作者只是唯一被刪除的作者作者,所以它不會有沒有作者關聯的書嗎?
例子:
BOOK1: John & Paul
BOOK2: John
BOOK3: Lucy
BOOK4: John & Lucy
,如果我從作者刪除約翰則觸發只會刪除BOOK2。
authors_books'外國鍵:ON DELETE CASCADE
1個作者可以有很多書籍/ 1本書可以有多個作者MySQL的觸發器:刪除間接相關條目
當作者被刪除,我是如何引發的MySQL(SQLite的)刪除書籍作者只是唯一被刪除的作者作者,所以它不會有沒有作者關聯的書嗎?
例子:
BOOK1: John & Paul
BOOK2: John
BOOK3: Lucy
BOOK4: John & Lucy
,如果我從作者刪除約翰則觸發只會刪除BOOK2。
authors_books'外國鍵:ON DELETE CASCADE
我寫了這個簡單的觸發器。完美作品:
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;
如果你需要純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)
整潔的代碼!謝謝。有沒有更好的方法來設計這個場景,所以我不必使用觸發器? (而不是'ON DELETE CASCADE') – Azevedo
問題是關係是'一對多',使用'on delete cascade'會刪除所有子記錄。因此,如果刪除author = 1,然後使用on刪除級聯,它將用於'authors_books'目的,但刪除您仍需編寫自定義查詢的書籍。不知道是否可以使用約束來完成。 –