假设我有一个表
artists
和一个表tracks
,两者之间是多对多关系。
当我删除艺术家时,我还想自动删除所有不再有对应艺术家的曲目,即在删除操作的同一命令中。
我可以对关联表执行此操作(即删除引用艺术家的相应行),但不能对曲目表中的孤立行执行此操作。
代码示例:
DROP TABLE IF EXISTS artists2tracks;
DROP TABLE IF EXISTS artists;
DROP TABLE IF EXISTS tracks;
CREATE TABLE artists (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL);
CREATE TABLE tracks (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL);
CREATE TABLE artists2tracks (
id INTEGER PRIMARY KEY,
artists_id INTEGER REFERENCES artists(id) ON DELETE CASCADE,
tracks_id INTEGER REFERENCES tracks(id) ON DELETE CASCADE
);
INSERT INTO artists (name) VALUES ("A1"),("A2"),("A3");
INSERT INTO tracks (title) VALUES ("T1"),("T2"),("T3");
INSERT INTO artists2tracks (artists_id, tracks_id) VALUES (1,1),(1,2),(2,2),(2,3),(3,3);
DELETE FROM artists WHERE id=1;
/* I want this to also delete row with tracks.id=1 */
您可以创建一个触发器,每次删除艺术家表后都会触发该触发器
CREATE TRIGGER delete_track_without_artist
AFTER DELETE ON artist
FOR EACH ROW
BEGIN
DELETE
FROM tracks
WHERE tracks.id NOT IN (SELECT tracks_id FROM artists2tracks)
END;
从艺术家表中删除一行后,触发器将删除artist2tracks表中未引用的每个曲目,因此没有对应的艺术家