Sql 删除外键未引用的行
这在某种程度上与: 我有一个带有主键的表,还有几个表引用了主键(使用外键)。我需要从该表中删除行,其中主键没有在任何其他表中被引用(以及一些其他约束) 例如:Sql 删除外键未引用的行,sql,postgresql,Sql,Postgresql,这在某种程度上与: 我有一个带有主键的表,还有几个表引用了主键(使用外键)。我需要从该表中删除行,其中主键没有在任何其他表中被引用(以及一些其他约束) 例如: Group groupid | groupname 1 | 'group 1' 2 | 'group 3' 3 | 'group 2' ... | '...' Table1 tableid | groupid | data 1 | 3 |
Group
groupid | groupname
1 | 'group 1'
2 | 'group 3'
3 | 'group 2'
... | '...'
Table1
tableid | groupid | data
1 | 3 | ...
... | ... | ...
Table2
tableid | groupid | data
1 | 2 | ...
... | ... | ...
等等。组中的某些行在任何表中都没有引用,我需要删除这些行。除此之外,我还需要知道如何查找组中引用给定行的所有表/行
我知道我可以查询每个表并检查groupid,但是因为它们是外键,我想有更好的方法来做
顺便说一句,这是在使用Postgresql 8.3。其核心是,SQL server不维护约束的双向信息,因此您唯一的选择是执行服务器在删除行时在内部执行的操作:每隔一个表检查一次
DELETE
FROM group g
WHERE NOT EXISTS
(
SELECT NULL
FROM table1 t1
WHERE t1.groupid = g.groupid
UNION ALL
SELECT NULL
FROM table1 t2
WHERE t2.groupid = g.groupid
UNION ALL
…
)
如果(而且首先要确保)您的约束是简单的检查,并且没有任何“on delete cascade”类型的语句,那么您可以尝试删除组表中的所有内容。因此,任何删除的行都不会引用它。否则,你会被卡西诺的答案所困扰。正如我所说,我希望避免这种情况。有几个表,名称约定不是标准的,而且速度很慢。既然约束已经存在,我认为必须有更好的方法。