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 qui rendent difficile la suppression de la contrainte plus tard. Que dois-je ajouter pour nommer les contraintes?

L'exemple ci-dessus est mssql j'en ai aussi besoin dans postgresql

35
demandé sur Rumpleteaser 2013-01-25 02:14:36

2 réponses

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 aussi dans PostgreSQL: http://www.sqlfiddle.com/#! 12 / 2ae29

61
répondu GolfWolf 2016-11-09 09:40:31
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 not null; une modification d'une contrainte not null nécessite une colonne ALTER TABLE MODIFY ... NULL. Les noms de contraintes doivent être inférieurs à ou égal à 30 caractères. Utiliser une convention de nommage. Personnellement, j'utilise toujours le nom de la table ajouté au nom de la colonne, qui est dévoué si le nom de la contrainte est supérieur à 30 caractères, suivi du type de contrainte (pk, fk,uk, etc.)

29
répondu Matthew Moisen 2013-01-24 22:58:26