自动删除多对多关系中未引用的行

问题描述 投票:0回答:1

假设我有一个表

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 */
database sqlite database-design triggers
1个回答
0
投票

您可以创建一个触发器,每次删除艺术家表后都会触发该触发器

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表中未引用的每个曲目,因此没有对应的艺术家

© www.soinside.com 2019 - 2024. All rights reserved.