删除外键未引用的行

时间:2009-08-18 16:06:48

标签: sql postgresql

这与this question

有些相关

我有一个带主键的表,我有几个引用该主键的表(使用外键)。我需要从该表中删除行,其中主键未在任何其他表中被引用(以及一些其他约束)。

例如:

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。

2 个答案:

答案 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的答案所困扰。