Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除外键未引用的行_Sql_Postgresql - Fatal编程技术网

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”类型的语句,那么您可以尝试删除组表中的所有内容。因此,任何删除的行都不会引用它。否则,你会被卡西诺的答案所困扰。

正如我所说,我希望避免这种情况。有几个表,名称约定不是标准的,而且速度很慢。既然约束已经存在,我认为必须有更好的方法。