Подтвердить что ты не робот

Добавление ограничений именованного внешнего ключа в инструкции 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
);

Но это добавляет ограничения с автоматически сгенерированными именами, из-за чего сложно удалить ограничение позже. Что мне нужно добавить, чтобы назвать ограничения?

Приведенный выше пример - mssql, он также нужен в postgresql

4b9b3361

Ответ 1

В SQL Server вы можете использовать ключевое слово constraint, чтобы определять внешние ключи inline и называть их одновременно.

Здесь обновлен script:

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

Я только что сделал тест, и, похоже, то же самое работает и в PostgreSQL: http://www.sqlfiddle.com/#!12/2ae29

Ответ 2

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

Используйте ключевое слово CONSTRAINT для указания имен ограничений. IMO является более чистым и более читаемым, чтобы делать это в конце-TABLE, а не в строке (оба приемлемы, как указывает второй ответ), и это также позволяет создавать ограничения UNIQUE для нескольких столбцов, а также несколько FK к той же таблице. Ключевое слово CONSTRAINT не может использоваться для не null; для изменения неопределенного ограничения требуется ALTER TABLE MODIFY COLUMN... null. Имена ограничений должны быть меньше или равно 30 символам. Используйте стандартное соглашение об именах. Лично я всегда использую имя таблицы, добавленное к имени столбца, которое devoveled, если имя ограничения превышает 30 символов, за которым следует тип ограничения (pk, fk, uk и т.д.)