我有一个带主键的表,我有几个引用该主键的表(使用外键)。我需要从该表中删除行,其中主键未在任何其他表中被引用(以及一些其他约束)。
例如:
Group
groupid | groupname
1 | 'group 1'
2 | 'group 3'
3 | 'group 2'
... | '...'
Table1
tableid | groupid | data
1 | 3 | ...
... | ... | ...
Table2
tableid | groupid | data
1 | 2 | ...
... | ... | ...
等等。 Group中的某些行未在任何表中引用,我需要删除这些行。除此之外,我需要知道如何找到引用Group中给定行的所有表/行。
我知道我可以查询每个表并查看groupid,但由于它们是外键,我想有更好的方法。
顺便说一下,这是使用Postgresql 8.3。
答案 0 :(得分:10)
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
…
)
答案 1 :(得分:3)
其核心是,SQL服务器不维护约束的双向信息,因此您唯一的选择是执行服务器在内部执行的操作,如果要删除行:请检查每个其他表。
如果(并且最先确定)您的约束是简单检查并且不带任何“on delete cascade”类型语句,您可以尝试从组表中删除所有内容。任何删除的行都没有引用它。否则,你会被Quassnoi的答案所困扰。