2009-08-18 16 views
5

ta jest nieco związane this question:Usuń wiersze NIE odwołują obcego klucza

Mam tabeli z kluczem podstawowym i mam kilka tabel, które odwołują się, że klucz podstawowy (przy użyciu kluczy obcych). Muszę usunąć wiersze z tej tabeli, gdzie klucz podstawowy nie jest odwoływany w żadnej z tych innych tabel (a także kilka innych ograniczeń).

Na przykład:

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

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

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

i tak dalej. Niektóre wiersze w grupie nie są przywoływane w żadnej z tabel i muszę usunąć te wiersze. Oprócz tego, muszę wiedzieć, jak znaleźć wszystkie tabele/wiersze, które odnoszą się do danego wiersza w grupie.

Wiem, że mogę po prostu przesyłać zapytania do każdego stołu i sprawdzać grupy, ale ponieważ są to klucze obce, wyobrażam sobie, że jest lepszy sposób na zrobienie tego.

Przy tej okazji korzystasz z PostgreSQL 8.3.

Odpowiedz

3

W sercu tego, serwery SQL nie utrzymują informacji 2-drożny dla ograniczeń, więc jedyną opcją jest, aby robić to, co serwer zrobi wewnętrznie jeśli było usunąć wiersz: sprawdź co drugi stół.

Jeśli (i na pewno najpierw będziesz cholernie pewny) twoje ograniczenia są prostymi sprawdzeniami i nie zawierają żadnych instrukcji typu "on delete cascade", możesz spróbować usunąć wszystko z tabeli grupowej. Każdy wiersz, który usuwa, nie ma w związku z tym żadnego odniesienia. W przeciwnym razie utknąłeś w odpowiedzi Quassnoia.

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

Cóż, tak jak powiedziałem, chciałbym uniknąć tej sytuacji. Istnieje kilka tabel, konwencje nazw nie są standardowe i jest powolna. Ponieważ ograniczenia już istnieją, sądzę, że musi istnieć lepszy sposób. –

Powiązane problemy