web-dev-qa-db-fra.com

Ajout de contraintes de clé étrangère nommées dans une instruction SQL Create

J'ai actuellement:

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

Mais cela ajoute des contraintes avec des noms générés automatiquement, ce qui rend difficile la suppression de la contrainte ultérieurement. Que dois-je ajouter pour nommer les contraintes?

L'exemple ci-dessus est mssql, j'en ai également besoin dans postgresql

42
Rumpleteaser

Dans SQL Server, vous pouvez utiliser le mot clé constraint pour définir des clés étrangères en ligne et les nommer en même temps.

Voici le script mis à jour:

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

Je viens de faire un test et apparemment la même chose fonctionne également dans PostgreSQL: http://www.sqlfiddle.com/#!12/2ae29

71
Cristian Lupascu
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)
);

Utilisez le mot clé CONSTRAINT pour spécifier les noms des contraintes. IMO, il est plus propre et plus lisible de faire cette fin de TABLE plutôt qu'en ligne (les deux sont acceptables, comme l'indique la deuxième réponse), et cela vous permet également de créer des contraintes UNIQUES sur plusieurs colonnes, ainsi que plusieurs FK à la même table. Le mot clé CONSTRAINT ne peut pas être utilisé pour non null; une modification d'une contrainte non nulle nécessite une ALTER TABLE MODIFY COLUMN ... null. Les noms de contrainte doivent être inférieurs ou égaux à 30 caractères. Utilisez une convention de dénomination standard. Personnellement, j'utilise toujours le nom de la table ajouté au nom de la colonne, qui est devoweled si le nom de la contrainte est supérieur à 30 caractères, suivi du type de contrainte (pk, fk, uk, etc.)

36
Matthew Moisen