2010-02-18 14 views
6

Sto cercando di memorizzare qualche sintassi sql e ho ottenuto la sintassi ALTER TABLE ADD CONSTRAINT. Credo di essere corretto quando dico che quando si utilizza questa sintassi per aggiungere un vincolo FOREIGN KEY o PRIMARY KEY, quel server SQL crea automaticamente indici per supportare le operazioni di vincolo. (È vero ... o è vero solo sul PK ma non sul FK?)Quando si rilascia un vincolo, anche gli indici di supporto vengono eliminati?

In tal caso, quando si utilizza la sintassi ALTER TABLE DROP CONSTRAINT ... anche gli indici di supporto vengono automaticamente ignorati? È possibile eliminare esplicitamente questi indici di supporto impliciti? In tal caso, il CONSTRAINT viene rimosso automaticamente?

Sto solo volendo sapere come funziona "sotto le coperte". Googling non ha aiutato. Immagino che avrei potuto interrogare alcuni tavoli sys per scoprire la verità, ma ho pensato di provare qui.

Grazie per il vostro aiuto.

Seth

risposta

2

Quando si aggiunge una chiave primaria, viene aggiunto un indice univoco. Indipendentemente dal fatto che l'aggiunta abbia causato il clustering del nuovo indice, dipende dal fatto che sia stato specificato che non sia cluster o meno. Se aggiungendo un vincolo di chiave primaria, non si specifica che è cluster o non cluster, verrà cluster se un vincolo cluster o un indice non esiste già sulla tabella altrimenti sarà non cluster.

Quando si aggiunge una chiave esterna, non viene creato automaticamente alcun indice.

Quando si rilascia un vincolo, gli indici creati come risultato della creazione del vincolo verranno eliminati. Tuttavia, se si tenta di eliminare un vincolo di chiave univoco o primario e ci sono vincoli di chiave esterna che lo fanno riferimento, si verificherà un errore.

Gli indici creati come risultato della creazione di un vincolo non possono essere eliminati utilizzando DROP INDEX.

2

un vincolo di chiave primaria si aggiunge un indice cluster sul tavolo, se non ne esiste ancora altrimenti un indice non univoco cluster verrà creato per questo.

L'eliminazione di un vincolo di chiave primaria comporta anche la caduta dell'indice sottostante.

Un vincolo di chiave esterna non aggiungerà un indice.

Eliminare un vincolo di chiave esterna non farà nulla per un indice.

Le chiavi esterne non hanno nulla a che fare con gli indici.

+0

Non sempre vero. Se esiste già un indice cluster sulla tabella, il vincolo PRIMARY KEY verrà applicato da un indice non cluster univoco. –

+0

In SQL Server 2008 le chiavi esterne hanno qualcosa in comune con gli indici. Non potevo rilasciare un indice (e non era indice della chiave primaria), perché se ci si riferiva a chiavi esterne. – LukLed

+1

@LukLed, quando si ha una relazione genitore-figlio da 1 a molti applicata con un FK, il genitore deve essere univoco, se si tenta di eliminare il vincolo di unicità sul genitore, si genera un errore. –

2

Gli FK non ottengono automaticamente un indice in SQL Server, se ne vuoi uno devi aggiungerlo! Quando si rilascia l'FK, non si rilascia un indice, è necessario rilasciare l'indice autonomamente.

2

L'indice che applica un vincolo UNIQUE verrà eliminato, un indice che supporta un vincolo FK non verrà eliminato automaticamente. Non verrà creato automaticamente neanche.

Problemi correlati