删除外键未引用的行

Nik*_*chi 6 sql postgresql

这与这个问题有些相关:

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

例如:

Group
groupid | groupname
    1   |    'group 1'
    2   |    'group 3'
    3   |    'group 2'
    ... |    '...'

Table1
tableid | groupid | data
    1   |    3    |    ...
    ... |    ...  |    ...

Table2
tableid | groupid | data
    1   |    2    |    ...
    ... |    ...  |    ...
Run Code Online (Sandbox Code Playgroud)

等等.Group中的某些行未在任何表中引用,我需要删除这些行.除此之外,我还需要知道如何找到引用Group中给定行的所有表/行.

我知道我可以查询每个表并检查groupid,但由于它们是外键,我想有更好的方法.

顺便说一下,这是使用Postgresql 8.3.

Qua*_*noi 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
        …
        )
Run Code Online (Sandbox Code Playgroud)

  • 就像我说的,我想避免这种情况.有几个表,名称约定不是标准的,而且很慢.由于约束已经到位,我认为必须有更好的方法. (3认同)

Jef*_*and 3

其核心是,SQL 服务器不维护约束的双向信息,因此您唯一的选择是执行服务器在删除行时会在内部执行的操作:检查所有其他表。

如果(并且首先要确定)您的约束是简单的检查并且不带有任何“删除级联”类型语句,您可以尝试从组表中删除所有内容。因此,任何删除的行都不会引用它。否则,你就会被夸斯诺伊的答案所困。