我有两张桌子,电影和歌曲。歌曲在电影中有外键。当电影中引用的所有歌曲都被删除时,我需要删除电影条目。就像反向级联一样,多到一。
当删除歌曲条目时,如果所有歌曲都将被删除,则电影应该被删除。
我怎样才能像级联删除一样在sqlite上实现这一点呢..?
发布于 2020-07-09 21:29:49
AFTER DELETE
触发器可以工作。示例sqlite3 shell会话:
sqlite> PRAGMA foreign_keys=on;
sqlite> CREATE TABLE movies(id INTEGER PRIMARY KEY, name);
sqlite> CREATE TABLE songs(id INTEGER PRIMARY KEY, name, movie_id INTEGER REFERENCES movies(id) ON DELETE CASCADE);
sqlite> CREATE INDEX songs_movie_id_idx ON songs(movie_id);
sqlite> CREATE TRIGGER cleanup_movies AFTER DELETE ON songs WHEN ((SELECT count(*) FROM songs WHERE movie_id=old.movie_id) = 0) BEGIN DELETE FROM movies WHERE id = old.movie_id; END;
sqlite> INSERT INTO movie VALUES (1, 'Some Movie');
sqlite> INSERT INTO song VALUES (1, 'Some Song', 1), (2, 'Some Other Song', 1);
sqlite> DELETE FROM songs WHERE id = 1;
sqlite> SELECT * FROM movies;
id name
---------- ----------
1 Some Movie
sqlite> DELETE FROM songs WHERE id = 2;
sqlite> SELECT * FROM movies;
sqlite>
扳机:
CREATE TRIGGER cleanup_movies AFTER DELETE ON songs
WHEN ((SELECT count(*) FROM songs WHERE movie_id=old.movie_id) = 0)
BEGIN
DELETE FROM movies WHERE id = old.movie_id;
END;
从songs
中删除一行后,如果songs
表中没有与已删除行相同的movie_id
行,则从movies
表中删除该id。
https://stackoverflow.com/questions/62818662
复制相似问题