Я создаю новую таблицу в 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"
)
Я совершенно не понимаю, что я пытаюсь сделать, невозможно, или я что-то делаю не так?
Редактировать:
Дэвид М. показал, как добавить именованное ограничение по умолчанию с использованием встроенного синтаксиса, я все еще пытаюсь понять, является ли автономный синтаксис полностью неправильным или это моя ошибка.
источник
Ответы:
Сделайте это во время создания столбца:
Я использовал квадратные скобки, а не кавычки, поскольку многие читатели не работают с ними
QUOTED_IDENTIFIERS
по умолчанию.источник
table_constraint
в грамматику не входитDEFAULT
[load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE()
. Обратите внимание на квадратные скобки вместо двойных кавычек.SET QUOTED_IDENTIFIER
переключает. Я пересмотрю ответ, так как в любом случае я предпочитаю квадратные скобки, я просто следовал стилю вопроса ОП.