首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Sqlit外部密钥反向级联删除

Sqlit外部密钥反向级联删除
EN

Stack Overflow用户
提问于 2020-07-09 15:42:35
回答 1查看 218关注 0票数 0

我有两张桌子,电影和歌曲。歌曲在电影中有外键。当电影中引用的所有歌曲都被删除时,我需要删除电影条目。就像反向级联一样,多到一。

当删除歌曲条目时,如果所有歌曲都将被删除,则电影应该被删除。

我怎样才能像级联删除一样在sqlite上实现这一点呢..?

  • 列表项目
EN

回答 1

Stack Overflow用户

发布于 2020-07-09 21:29:49

AFTER DELETE 触发器可以工作。示例sqlite3 shell会话:

代码语言:javascript
运行
复制
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>

扳机:

代码语言:javascript
运行
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62818662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档