正确地删除“;相依;SQLite中的元素
我试图找到一个解决方案,如何正确地从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也被
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