2009-09-09 19 views
27

Qual è lo scopo della denominazione dei vincoli (unica, chiave primaria, chiave esterna)?Qual è lo scopo della denominazione dei vincoli

Dire Ho una tabella che sta usando le chiavi naturali come chiave primaria:

CREATE TABLE Order 
(
    LoginName  VARCHAR(50) NOT NULL, 
    ProductName  VARCHAR(50) NOT NULL, 
    NumberOrdered INT   NOT NULL, 
    OrderDateTime DATETIME  NOT NULL, 
    PRIMARY KEY(LoginName, OrderDateTime) 
); 

Che benefici (se del caso) non naming mia PK portare?

Es. Sostituire:

PRIMARY KEY(LoginName, OrderDateTime) 

Con:

CONSTRAINT Order_PK PRIMARY KEY(LoginName, OrderDateTime) 

dispiace se il mio modello di dati non è il migliore, io sono nuovo a questo!

+1

forse usare il nome per riferirsi al vincolo più tardi .. come quando si desidera eliminare \ modificarlo? – Aziz

risposta

62

Ecco alcuni motivi di base.

(1) Se una query (inserire, aggiornare, eliminare) viola un vincolo, SQL genererà un messaggio di errore che conterrà il nome del vincolo. Se il nome del vincolo è chiaro e descrittivo, il messaggio di errore sarà più facile da capire; se il nome del vincolo è un nome basato su guide casuali, è molto meno chiaro. In particolare per gli utenti finali, chi (ok, potrebbe) ti telefonerà e chiederà cosa significa "FK__B__B_COL1__75435199".

(2) Se un vincolo deve essere modificato in futuro (sì, succede), è molto difficile da fare se non si conosce il nome. (ALTER TABLE MyTable drop CONSTRAINT um ...) E se crei più di una istanza del database "da zero" e usi i nomi predefiniti generati dal sistema, non ci saranno mai due nomi uguali.

(3) Se la persona che arriva a supportare il tuo codice (ovvero un DBA) deve sprecare un sacco di tempo inutile occupandosi di caso (1) o caso (2) alle 3 del mattino di domenica, sono molto probabilmente in grado di identificare da dove proviene il codice ed essere in grado di reagire di conseguenza.

+1

+1 copre tutte le basi – gbn

4

Per identificare il vincolo in futuro (ad esempio, si desidera rilasciarlo in futuro), dovrebbe avere un nome univoco. Se non si specifica un nome per questo, il motore di database probabilmente assegnerà un nome strano (ad esempio, contiene elementi casuali per garantire l'univocità) per te.

+0

Ciò significa che la denominazione viene utilizzata solo in modo che le persone possano identificare più facilmente un vincolo? In altre parole, non ha importanza (o influenza) il DBMS in alcun modo se si nomina un vincolo o no? Non puoi usarlo in codice per qualche scopo? Scusa se non era chiaro. – Andrew

+1

È solo un nome. Il nome non fa una differenza funzionale. Se vuoi fare riferimento in codice in futuro, il nome è importante, ovviamente. È come dire, un nome di variabile nel codice. –

+1

Proprio come i nomi colonna * * non fanno la differenza. Se descrivono cosa sono ("ProductId" invece di "BJZ0_340" o "Fred"), sono molto più utili. –

1

Aiuta qualcuno a sapere rapidamente quali sono i vincoli senza dover osservare il vincolo effettivo, poiché il nome fornisce tutte le informazioni necessarie.

Quindi, so se si tratta di una chiave primaria, una chiave univoca o una chiave predefinita, oltre alla tabella e alle possibili colonne coinvolte.

3

Mantiene i DBA soddisfatti, quindi lasciano la definizione dello schema nel database di produzione.

+0

Haha ... sì, credo che questo sia il motivo più importante: P – Andrew

3

Quando il codice viola in modo casuale alcuni vincoli di chiave esterna, è sicuro che si risparmia tempo nel debug per capire quale fosse. La loro denominazione semplifica notevolmente il debug degli inserti e degli aggiornamenti.

1

Denominando correttamente tutti i vincoli, è possibile associare rapidamente un particolare vincolo al nostro modello di dati. Questo ci dà due vantaggi reali:

  1. Siamo in grado di identificare e correggere rapidamente eventuali errori.
  2. Siamo in grado di modificare o eliminare in modo affidabile i vincoli.
Problemi correlati