正确地删除“;相依;SQLite中的元素

正确地删除“;相依;SQLite中的元素,sql,sqlite,Sql,Sqlite,我试图找到一个解决方案,如何正确地从SQLite中删除相关数据 有两个具有多对多关系的表和中间的“连接器”表。 这个例子非常经典:有一个DataTable项,它可以包含多个TagTable项。此外,每个TagTable项可以属于多个DataTable项 结构如下: TagTable: id, name DataTable: id, description, amount ConnectorTable: id, tagTable_id, dataTable_id dataTable\u id也被

我试图找到一个解决方案,如何正确地从SQLite中删除相关数据

有两个具有多对多关系的表和中间的“连接器”表。 这个例子非常经典:有一个
DataTable
项,它可以包含多个
TagTable
项。此外,每个
TagTable
项可以属于多个
DataTable

结构如下:

TagTable: id, name
DataTable: id, description, amount
ConnectorTable: id, tagTable_id, dataTable_id
dataTable\u id
也被标记为外键


TagTable
记录应仅当至少有一个连接到
DataTable
时才存在。因此,当我删除
DataTable
时,相关的
ConnectorTable
项将通过外键自动删除。然后,我需要检查从已删除的
DataTable
项中删除的
TagTable
项是否仍然至少有一个连接(它们被其他
DataTable
项使用),如果没有连接,则删除。我不知道如何正确地做这件事。。所以我在寻求帮助。谢谢!:)

您可以这样定义表:

create table DataTable(id integer primary key, description text, amount real);

create table TagTable(id integer primary key, name text);

create table ConnectorTable(
  tagTable_id int references TagTable(id) on delete cascade, 
  dataTable_id int references DataTable(id) on delete cascade,
  primary key(tagTable_id, dataTable_id)
);
ConnectorTable
中不需要
id
,因为
tagTable\u id
dataTable\u id
的组合可能是表的
主键。

现在,通过打开外键支持

PRAGMA foreign_keys = ON;
您可以在表
ConnectorTable
中插入行,其中包含表
DataTable
TagTable
中已经存在的两列的值

如果从
DataTable
TagTable
中删除一行,则
ConnectorTable
中包含对已删除行的引用的所有行也将被删除。
这就是删除级联操作的作用。

因此,假设您从
DataTable
中删除了一行,并且从
ConnectorTable
中包含对
DataTable
的已删除
id
的引用的行也将被删除。
现在,您可能会在
TagTable
中找到未被
ConnectorTable
中的任何行引用的行,因此您可以使用此查询进行清理:

delete from TagTable
where not exists (select 1 from ConnectorTable c where c.tagTable_id = TagTable.id)
使用类似的操作,如果先从
TagTable
中删除一行,则可以随后清理表
DataTable