2013-01-24 6 views
27

Al momento ho:Aggiunta di nome vincoli di chiave esterna in uno SQL CREATE

CREATE TABLE galleries_gallery (
    id    INT NOT NULL PRIMARY KEY IDENTITY, 
    title   NVARCHAR(50) UNIQUE NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL REFERENCES galleries_templates(id), 
    jsAltImgID  INT NOT NULL REFERENCES libraryImage(id) 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0 
); 

ma questo aggiunge vincoli con l'auto generato nomi che rendono difficile eliminare il vincolo più tardi. Cosa devo aggiungere per denominare i vincoli?

L'esempio sopra è mssql ho anche bisogno in PostgreSQL

+0

Ecco la [create table] (http://msdn.microsoft .com/it/us/library/ms174979.aspx) da MSDN. 'rowguid uniqueidentifier ROWGUIDCOL NOT NULL CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (newid())' – Hiten004

risposta

52

In SQL Server, è possibile utilizzare la parola chiave constraint per definire chiavi esterne in linea e denominarle contemporaneamente.

Ecco lo script aggiornato:

CREATE TABLE galleries_gallery (
    id    INT NOT NULL PRIMARY KEY IDENTITY, 
    title   NVARCHAR(50) UNIQUE NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL 
     CONSTRAINT FK_galerry_template 
     REFERENCES galleries_templates(id), 
    jsAltImgID  INT NOT NULL 
     CONSTRAINT FK_gallery_jsAltImg 
     REFERENCES libraryImage(id) 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0 
); 

Ho appena fatto un test e apparentemente la stessa cosa funziona anche in PostgreSQL: http://www.sqlfiddle.com/#!12/2ae29

+1

In Sqlite funziona alose. – PaulP

26
CREATE TABLE galleries_gallery (
    id    INT NOT NULL, 
    title   NVARCHAR(50) NOT NULL, 
    description  VARCHAR(256), 
    templateID  INT NOT NULL, 
    jsAltImgID  INT NOT NULL, 
    jsAltText  NVARCHAR(500), 
    dateCreated  SMALLDATETIME NOT NULL, 
    dateUpdated  SMALLDATETIME NOT NULL, 
    lastUpdatedBy INT, 
    deleted   BIT NOT NULL DEFAULT 0, 
    CONSTRAINT galleries_gallery_id_pk PRIMARY KEY (id), 
    CONSTRAINT galleries_gallery_title_uk UNIQUE (title), 
    CONSTRAINT galleries_gallery_tmpltid_fk FOREIGN KEY (templateID) REFERENCES galleries_templates (id), 
    CONSTRAINT galleries_gallery_jsAltImgIDfk FOREIGN KEY (isAltImgID) REFERENCES libraryImage (id) 
); 

Utilizzare la parola chiave CONSTRAINT per specificare i nomi di vincolo. IMO è più pulito e più leggibile per eseguire questa end-of-TABLE anziché in-line (entrambi sono accettabili, come indica la seconda risposta) e ciò consente anche di creare vincoli UNIQUE su più colonne, nonché più FK allo stesso tavolo La parola chiave CONSTRAINT non può essere utilizzata per non null; una modifica a un vincolo non nullo richiede una ALTER TABLE MODIFY COLUMN ... null. I nomi dei vincoli devono essere inferiori o uguali a 30 caratteri. Utilizzare una convenzione di denominazione standard. Personalmente uso sempre il nome della tabella anteposto al nome della colonna, che è devoweled se il nome del vincolo è di oltre 30 caratteri, seguito dal tipo di vincolo (pk, fk, uk, ecc.)

+0

Mentre posso vedere che la tua risposta è accurata, applicherò la risposta di w0lf in questo caso poiché si adatta a ciò che sto cercando. – Rumpleteaser

+7

@LauraHansen tieni presente che la sintassi in cui aggiungi i vincoli alla fine della definizione della tabella è più flessibile, nel caso in cui tu abbia mai vincoli a più colonne. –

+1

Questa è la risposta più corretta secondo i commenti di @ AaronBertrand. Tuttavia, è importante notare che, almeno in MSSQL, la lunghezza massima del nome del vincolo è di 128 caratteri. –