Оголошення обмеження за замовчуванням під час створення таблиці


100

Я створюю нову таблицю на сервері Microsoft SQL 2000, записуючи код замість GUI, я намагаюся навчитися робити це "вручну".

Це код, який я фактично використовую, і він прекрасно працює:

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



Я тут повністю втрачений, це те, що я намагаюся зробити, не можливо, або я щось роблю не так?


Редагувати:

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


3
Я згоден з редагуванням. Відповідь Девіда М не стосується того, як додати обмеження за допомогою окремої декларації обмеження, але оскільки BOL не має жодних прикладів, де можна назвати обмеження за замовчуванням, за винятком способу, який демонстрував Девід М, я вважаю, що безпечно припускати SQL Сервер (непослідовно) не підтримує цей синтаксис.
Пітер Маджед

Відповіді:


177

Зробіть це в порядку зі створенням стовпця:

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

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


3
Дякуємо, що це вирішує проблему з іменем. Зараз я намагаюся розібратися, чи така поведінка "за задумом" (тобто зробити це неможливо) чи є спосіб це зробити. Ви знаєте, мені подобається тримати свій код "охайним", а обмеження, оголошені після стовпців, роблять файли SQL зрозумілішими та простішими для розуміння та налагодження (або, принаймні, так я вважаю).
Альбірео

3
@Albireo - За дизайном. table_constraintв граматиці не включає в себеDEFAULT
Martin Smith

2
Це рішення працює для мене лише тоді, коли я видаляю лапки навколо імен поля та обмежень.
Девід С.

1
Для новіших версій використання SQL Server [load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE(). Зауважте квадратні дужки замість подвійних лапок.
смертельної собаки

3
Насправді, не новіша версія / версія - SET QUOTED_IDENTIFIERперемикання. Я перегляну відповідь, оскільки в будь-якому випадку віддаю перевагу квадратним дужкам, я тільки що дотримувався стилю питання ОП.
Девід М
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.