2009-08-18 106 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