2012-01-31 9 views
7

Ho una tabella che il suo campo "ID" chiave primaria viene utilizzato in molte altre tabelle come chiave esterna.come verificare se una chiave di un record viene utilizzata in altre tabelle come chiave esterna (sql)?

Come posso realizzare che un record da questa tabella (ad esempio, il primo record "ID = 1") sia utilizzato in un'altra tabella?

Non voglio selezionare da tutte le altre tabelle per capire perché le tabelle sono così tante e le relazioni. Ho cercato una soluzione, non c'erano soluzioni funzionanti o ho sbagliato. Per favore aiuto.

+2

Per che cosa è necessario sapere questo? Non cancellare un record se è usato come FK? Quindi imposta le chiavi esterne delle altre tabelle come "ON DELETE RESTRICT" anziché "CASCADE". Boom, non più cancellazioni involontarie. –

+0

Ho un campo Isdeleted che lo faccio diventare vero se qualsiasi altro record usa l'ID di questo record come chiave esterna ma se questo ID del record non è usato in altre tabelle come chiave esterna, voglio cancellarlo. – ares

+3

Il server SQL non supporta ON DELETE RESTRICT, ma è possibile utilizzare ON DELETE NO ACTION per ottenere il comportamento desiderato (errore se si tenta di eliminare una riga utilizzata da un'altra tabella come FK). –

risposta

2

È necessario per unire tutti gli altri tavoli. In questo modo:

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

Se tutte le colonne FK sono indicizzate, questo sarà estremamente efficiente. Otterrai un bel join di unione.

8

Per un modo generico, utilizzare questo e otterrete tutte le tabelle che hanno la chiave esterna, e quindi si può fare un ciclo per controllare tutte le tabelle in elenco. In questo modo è possibile aggiungere chiavi esterne e non sarà necessario modificare il codice ...

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

Funziona come un fascino! –

+2

Eppure il codice più semplice potrebbe essere: 'select nome_oggetto (parent_object_id) * da sys.foreign_keys dove referenced_object_id = object_id ('dbo.TableName')' –

Problemi correlati