Используйте ключевое слово CONSTRAINT при создании таблицы - PullRequest
0 голосов
/ 10 мая 2019

Вопрос об использовании ключевого слова CONSTRAINT при создании новой таблицы.Я видел такой код ниже:

CREATE TABLE dbo.T1
(
    keycol INT NOT NULL IDENTITY(1, 1) 
        CONSTRAINT PK_T1 PRIMARY KEY,
    datacol NVARCHAR(40) NOT NULL
);

Мой вопрос: NOT NULL также не является CONSTRAINT таким же, как PRIMARY KEY, так почему мы помещаем ключевое слово CONSTRAINT для PRIMARY KEY, но не для NOT NULL?

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Как задокументировано в CREATE TABLE

CONSTRAINT Это необязательное ключевое слово, которое указывает начало определения ПЕРВИЧНОГО КЛЮЧА, НЕ НУЛЬ, УНИКАЛЬНОГО, ИНОСТРАННОГО КЛЮЧА илиПРОВЕРЬТЕ ограничение.

, чтобы вы могли использовать ключевое слово CONSTRAINT, если хотите

CREATE TABLE dbo.T1
(
    keycol INT NOT NULL IDENTITY(1, 1) 
        CONSTRAINT PK_T1 PRIMARY KEY,
    datacol NVARCHAR(40) CONSTRAINT Foo NOT NULL
);

Это бессмысленно, поскольку ключевое слово ограничения всегда требуется только для ограничений при указанииимя.И при использовании с NOT NULL это фактически не создает объект ограничения в sys.constraints, поэтому имя нигде не сохраняется.Это просто свойство столбца независимо от того, является ли оно пустым.

1 голос
/ 10 мая 2019

Ограничение NOT NULL можно изменить с помощью оператора ALTER TABLE ALTER COLUMN. Поэтому явное имя для ограничения NOT NULL бесполезно. Имя ограничения NOT NULL не будет сохранено в метаданных базы данных.

Другие ограничения (первичный ключ, внешний ключ, уникальный, проверка и значение по умолчанию) могут быть удалены с помощью оператора ALTER TABLE DROP CONSTRAINT. Для таких операторов должно быть указано имя ограничения. Таким образом, технически имя ограничения всегда требуется для таких ограничений.

Но имена ограничений всегда являются необязательными в синтаксисе SQL , поэтому вы всегда можете опустить CONSTRAINT [constraintname] при создании ограничения. Так что это тоже допустимый SQL:

CREATE TABLE dbo.T1
(
    keycol INT NOT NULL IDENTITY(1, 1) PRIMARY KEY,
    datacol NVARCHAR(40) NOT NULL
);

Однако для ограничений, которые на самом деле потребуют имя ограничения для удаления, СУБД автоматически сгенерирует имя ограничения, если оно не указано явно. В приведенном выше операторе CREATE TABLE первичный ключ получит имя, подобное PK__T1__98D78B44D915DA1F.

Явное присвоение имен вашим первичным ключам, внешним ключам, уникальным ограничениям, проверочным ограничениям и ограничениям по умолчанию облегчит дальнейшее обслуживание таблиц вашей базы данных. Если вы явно дадите имена своим ограничениям, вы всегда будете точно знать, как эти ограничения по имени. Если вы хотите удалить «безымянное» ограничение, вы должны сначала найти его сгенерированное имя в метаданных базы данных (что я считаю довольно уродливым и сложным).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...