2012-01-31 12 views
7

Mam tabelę, której pole klucza podstawowego "ID" jest używane w wielu innych tabelach jako klucz obcy.jak sprawdzić, czy klucz rekordu jest używany w innych tabelach jako klucz obcy (sql)?

Jak mogę zrozumieć, że rekord z tej tabeli (na przykład pierwszy rekord "ID = 1") jest używany w innej tabeli?

Nie chcę wybierać ze wszystkich innych tabel, aby zrozumieć, ponieważ tabele są tak liczne i relacje. Szukałem rozwiązania, nie było żadnych działających rozwiązań lub źle to zrobiłem. Proszę pomóż.

+2

Po co to robić? Aby nie usunąć rekordu, jeśli jest używany jako FK? Następnie ustaw inne klucze obcych na "ON DELETE RESTRICT" zamiast "CASCADE". Bum, nie więcej niezamierzonych usunięć. –

+0

Mam pole Isdeleted, które ustawię jako prawdziwe, jeśli jakikolwiek inny rekord używa identyfikatora tego rekordu jako klucza obcego, ale jeśli identyfikator tego rekordu nie jest używany w innych tabelach jako klucz obcy, chcę go usunąć. – ares

+3

Serwer SQL nie obsługuje opcji USUŃ RESTRICT, ale można użyć polecenia NA USUŃ NIE AKCJA, aby uzyskać pożądane zachowanie (błąd w przypadku próby usunięcia wiersza używanego przez inną tabelę jako FK). –

Odpowiedz

2

Musisz potrzebujesz, aby dołączyć do wszystkich innych stołów. W ten sposób:

select * 
from Parents 
where 
exists(select * from Children1 where ...) 
or exists(select * from Children2 where ...) 
or exists(select * from Children3 where ...) 

Jeśli wszystkie twoje kolumny FK zostaną zindeksowane, będzie to wyjątkowo wydajne. Dostaniesz fajne sprzężenia scalające.

8

W ogólny sposób użyj tego, a otrzymasz wszystkie tabele z kluczem obcym, a następnie możesz zrobić pętlę, aby sprawdzić wszystkie tabele na liście. W ten sposób możesz dodać klucze obce i nie będzie potrzeby zmiany kodu ...

SELECT 
sys.sysobjects.name, 
sys.foreign_keys.* 
FROM 
sys.foreign_keys 
inner join sys.sysobjects on 
    sys.foreign_keys.parent_object_id = sys.sysobjects.id 
WHERE 
referenced_object_id = OBJECT_ID(N'[dbo].[TableName]') 
+1

Działa jak urok! –

+2

Jeszcze prostszy kod może być: 'select object_name (parent_object_id) * from sys.foreign_keys, gdzie referced_object_id = object_id (" dbo.TableName ")' –