2013-01-24 18 views
27

Obecnie mam:Dodawanie nazwanych kluczy obcych w 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 
); 

Ale to dodaje ograniczeń z automatycznie generowane nazwy, które sprawiają, że trudno upuścić ograniczenie później. Co muszę dodać, aby wymienić ograniczenia?

Powyższy przykład jest MSSQL i również potrzebują go w PostgreSQL

+0

Oto [create table] (http://msdn.microsoft .com/en-us/library/ms174979.aspx) z MSDN. 'rowguid uniqueidentifier ROWGUIDCOL NOT NULL CONSTRAINT DF_PurchaseOrderDetail_rowguid DEFAULT (newid())' – Hiten004

Odpowiedz

52

W programie SQL Server można: użyj słowa kluczowego constraint, aby zdefiniować klucze obce inline i nadawać im nazwy w tym samym czasie.

Oto zaktualizowany skrypt:

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 
); 

Zrobiłem test i widocznie samo działa również w PostgreSQL: http://www.sqlfiddle.com/#!12/2ae29

+1

W Sqlite to alose działa. – 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) 
); 

Użyj słowa kluczowego CONSTRAINT określić nazwy ograniczeń. IMO jest bardziej przejrzysty i czytelniejszy, aby wykonać ten koniec TABELI niż w linii (oba są akceptowane, jak wskazuje druga odpowiedź), a to pozwala również tworzyć wiązania UNIQUE na wielu kolumnach, a także wiele FK do tego samego stołu. Słowo kluczowe CONSTRAINT nie może być używane, jeśli nie jest pusta; zmiana ograniczenia na wartość nie pustą wymaga zmiany tablicy MODIFY COLUMN ... null. Nazwy ograniczeń nie mogą być dłuższe niż 30 znaków. Użyj standardowej konwencji nazewnictwa. Osobiście zawsze używam nazwy tabeli dodanej do nazwy kolumny, która jest wyodrębniona, jeśli nazwa ograniczenia zawiera więcej niż 30 znaków, a następnie typ ograniczenia (pk, fk, uk itd.).

+0

Podczas gdy widzę, że twoja odpowiedź jest zadowalająca, będę stosował odpowiedź w0lf w tym przypadku, ponieważ pasuje ona do tego, czego szukam. – Rumpleteaser

+7

@LauraHansen wystarczy zauważyć, że składnia, w której dodajesz ograniczenia na końcu definicji tabeli, jest bardziej elastyczna, jeśli kiedykolwiek masz ograniczenia z wieloma kolumnami. –

+1

To jest poprawniejsza odpowiedź zgodnie z komentarzami @ AaronBertrand. Należy jednak pamiętać, że przynajmniej w MSSQL maksymalna długość nazwy ograniczenia to 128 znaków. –

Powiązane problemy