2009-08-18 158 views
5

这在一定程度上关系到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的方式。

回答

3

在它的心脏,SQL服务器不保持约束2路信息,所以你唯一的选择是做什么,如果你要删除该行的服务器将在内部做的:检查所有其他表。

如果(而且首先确定)你的约束是简单的检查,并且不带有任何“删除级联”类型的语句,你可以尝试删除组表中的所有内容。任何删除的行都不会引用它。否则,你坚持Quassnoi的答案。

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 
     … 
     ) 
+3

就像我说的,我想避免这种情况。有几个表,名称约定不是标准的,它很慢。由于约束已经到位,我认为必须有更好的方法。 – 2009-08-18 16:19:04