代码之家  ›  专栏  ›  技术社区  ›  robertspierre

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

  •  0
  • robertspierre  · 技术社区  · 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 */
    
    1 回复  |  直到 1 年前
        1
  •  1
  •   wald_rabe    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;
    

    在从artists2tracks表中删除一行之后,触发器将删除artists2tRacks表中未引用的、因此没有相应的艺术家的每个曲目