Объявление ограничения по умолчанию при создании таблицы

100

Я создаю новую таблицу в Microsoft SQL server 2000 путем написания кода вместо использования графического интерфейса пользователя, я пытаюсь научиться делать это «вручную».

Это код, который я использую на самом деле, и он отлично работает:

CREATE TABLE "attachments"
(
    "attachment_id" INT NOT NULL,
    "load_date" SMALLDATETIME NOT NULL,
    "user" VARCHAR(25) NOT NULL,
    "file_name" VARCHAR(50) NOT NULL,
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"),
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"),
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE())
)

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

Проблема возникла, когда я попытался объявить ограничение значения по умолчанию: глядя на информацию в Интернете и на то, как Microsoft SLQ Server Management Studio создает ее, я понял, что ее можно создать как встроенной, так и отдельной:

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

или

CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"

Встроенный метод работает нормально, но он, как обычно, генерирует случайное имя для константы, автономный метод выдает ошибку, говоря Incorrect syntax near 'FOR'..

Кроме того, если я создам таблицу, а затем ALTERона, команда работает:

ALTER TABLE "attachments"
ADD CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"


В качестве справки вот полный код, который я пытаюсь выполнить:

CREATE TABLE "attachments"
(
    "attachment_id" INT NOT NULL,
    "load_date" SMALLDATETIME NOT NULL,
    "user" VARCHAR(25) NOT NULL,
    "file_name" VARCHAR(50) NOT NULL,
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"),
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"),
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE()),
    CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
)



Я совершенно не понимаю, что я пытаюсь сделать, невозможно, или я что-то делаю не так?


Редактировать:

Дэвид М. показал, как добавить именованное ограничение по умолчанию с использованием встроенного синтаксиса, я все еще пытаюсь понять, является ли автономный синтаксис полностью неправильным или это моя ошибка.

Albireo
источник
3
Я согласен с редактированием. Ответ Дэвида М не касается того, как добавить ограничение с помощью объявления автономного ограничения, но, поскольку в BOL нет примеров, в которых вы могли бы назвать ограничение по умолчанию, кроме того, как продемонстрировал Дэвид М, я думаю, что можно безопасно предположить, что SQL Сервер (непоследовательно) не поддерживает этот синтаксис.
Питер Маджид,

Ответы:

177

Сделайте это во время создания столбца:

[load_date] SMALLDATETIME NOT NULL
        CONSTRAINT [df_load_date] DEFAULT GETDATE()

Я использовал квадратные скобки, а не кавычки, поскольку многие читатели не работают с ними QUOTED_IDENTIFIERSпо умолчанию.

Дэвид М
источник
3
Спасибо, проблема с именем решена. Теперь я пытаюсь выяснить, является ли такое поведение «преднамеренным» (т.е. это невозможно сделать) или есть способ сделать это. Вы знаете, мне нравится, когда мой код "аккуратен", а ограничения, объявленные после столбцов, делают файлы SQL более понятными и легкими для понимания и отладки (по крайней мере, я так думаю).
Albireo
3
@Albireo - По дизайну. table_constraintв грамматику не входитDEFAULT
Мартин Смит
2
Это решение работает для меня только тогда, когда я удаляю кавычки вокруг имен полей и ограничений.
Дэвид С.
1
Для более новых версий SQL Server используйте [load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE(). Обратите внимание на квадратные скобки вместо двойных кавычек.
deadlydog
3
Не совсем новая / старая версия - SET QUOTED_IDENTIFIERпереключает. Я пересмотрю ответ, так как в любом случае я предпочитаю квадратные скобки, я просто следовал стилю вопроса ОП.
Дэвид М.