代码之家  ›  专栏  ›  技术社区  ›  Niki Yoshiuchi

删除外键未引用的行

  •  5
  • Niki Yoshiuchi  · 技术社区  · 15 年前

    这与 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    |    ...
        ... |    ...  |    ...
    

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

    我知道我可以查询每个表并检查groupid,但是由于它们是外键,所以我认为有更好的方法可以做到这一点。

    顺便说一下,这是使用PostgreSQL 8.3。

    2 回复  |  直到 9 年前
        1
  •  3
  •   Jeff Ferland    15 年前

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

    如果您的约束是简单的检查,并且没有任何“on delete cascade”类型的语句,那么您可以尝试从组表中删除所有内容。因此,任何删除的行都不会引用它。否则,你就只能坚持奎斯诺的回答。

        2
  •  10
  •   Quassnoi    15 年前
    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
            …
            )