【发布时间】:2019-04-27 10:30:00
【问题描述】:
我的架构大致如下所示:
CREATE TABLE posts(
id INTEGER PRIMARY KEY,
txt TEXT,
);
CREATE TABLE tags(
id INTEGER PRIMARY KEY,
tag TEXT
);
CREATE TABLE posts_tags(
id INTEGER PRIMARY KEY,
tag_id INTEGER NOT NULL REFERENCES tags(id) ON DELETE CASCADE
);
我想删除具有指定 ID 的帖子,但我也想删除与该帖子相关但没有任何其他帖子关联的所有标签。
所以,假设只有一篇关于编程的帖子,那么当该帖子被删除时,"programming" 标签应该会消失。但是,如果有多个关于sports 的帖子,删除一个应该保持标签完整,并且只从posts_tags 表中删除适当的关系(我假设这是通过级联自动完成的)。
我知道我可以选择所有标签,使用我选择的编程语言循环它们,验证它们是否只有一个关联的帖子并删除它们,但我正在寻找一种更简单的与 SQL 一起使用的解决方案。
我需要为多个表执行此操作,因此多次复制/粘贴代码效率低下。
有没有办法做到这一点?
我研究了多对多的关系并删除,但我发现的只是提到使用触发器。但是,我真的不知道应该使用什么触发器。
【问题讨论】:
-
您的
post_tags表不应该有一列是引用posts(id)的外键吗?特别是如果您希望在发布帖子时自动删除行?这不会像现在这样发生。
标签: sql sqlite triggers cascading-deletes