2009-08-18 7 views
5

verwiesen wird diese etwas im Zusammenhang mit this question:Reihen entfernen NICHT durch einen Fremdschlüssel

Ich habe eine Tabelle mit einem Primärschlüssel, und ich habe mehrere Tabellen, die den Primärschlüssel Referenz (unter Verwendung von Fremdschlüsseln). Ich muss Zeilen aus dieser Tabelle entfernen, in denen der Primärschlüssel in keiner dieser anderen Tabellen referenziert wird (sowie einige andere Einschränkungen).

Zum Beispiel:

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

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

Table2 
tableid | groupid | data 
    1 | 2 | ... 
    ... | ... | ... 

und so weiter. Einige Zeilen in der Gruppe sind in keiner der Tabellen referenziert, und ich muss diese Zeilen entfernen. Außerdem muss ich wissen, wie alle Tabellen/Zeilen gefunden werden, die auf eine bestimmte Zeile in der Gruppe verweisen.

Ich weiß, dass ich nur jede Tabelle abfragen und die Gruppen-IDs überprüfen kann, aber da sie Fremdschlüssel sind, stelle ich mir vor, dass es einen besseren Weg gibt, es zu tun.

Dies ist mit Postgresql 8.3 übrigens.

Antwort

3

Im Herzen den es, SQL-Server nicht beibehalten 2-Wege-Info für Einschränkungen, so dass Ihre einzige Möglichkeit ist, zu tun, was der Server intern tun würde, wenn Sie die Zeile löschen sind: überprüft jede andere Tabelle.

Wenn (und verdammt zuerst) Ihre Einschränkungen einfache Überprüfungen sind und keine "on delete cascade" Anweisungen enthalten, können Sie versuchen, alles aus Ihrer Gruppentabelle zu löschen. Jede Zeile, die löscht, würde somit nichts referenzieren. Sonst steckst du mit Quassnois Antwort fest.

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

Nun, wie ich schon sagte, ich möchte diese Situation vermeiden. Es gibt mehrere Tabellen, die Namenskonventionen sind nicht Standard und es ist langsam. Da die Einschränkung bereits vorhanden ist, denke ich, dass es einen besseren Weg geben muss. –

Verwandte Themen