2015-07-29 3 views
1

Для каждого табличного ограничения, я вижу, что есть сокращенная форма, пол-сокращенная форма и полная форма (Пардон за именование. Предложения о том, как правильно называть их радушны)DEFAULT CONSTRAINT полной форма

Например

сокращенном виде: пусть имя ограничения быть определена с помощью SQL Server, столбец быть затронуты подразумевается, как столбец определяется

CREATE TABLE myTable 
(
    id int PRIMARY KEY, 
) 

Semi-сокращенная форма: явное имя ограничения, подразумеваемые столбец

id int CONSTRAINT PK_ID PRIMARY KEY, 

Полная форма: как явные. Разрешить определение в конце отделено от определения столбца

id int, 
Name varchar(40), 
CONSTRAINT PK_ID PRIMARY KEY(id) 

Из того, что я вижу, полная форма часто рассматривается в ALTER TABLE, где ограничения определены позже.

Для DEFAULT ограничение

форма Короткие руки

id int DEFAULT newid() 

Semi-сокращенная форма

id int CONSTRAINT DF_ID DEFAULT newid() 

Я вижу использование полной формы в ALTER TABLE как here

ALTER TABLE [dbo].[Customers] WITH NOCHECK ADD 
    CONSTRAINT [DF__Customers__cust___151B244E] 
    DEFAULT ('new customer') FOR [cust_name], 
    CONSTRAINT [def_last_updated_by] DEFAULT 
    (suser_sname()) FOR [last_updated_by], 
    PRIMARY KEY CLUSTERED 
    ([cust_id]) ON [PRIMARY] 
GO 

Однако определение полной формы при создании таблицы не удается

CREATE TABLE testGUIDs 
(
    ID uniqueidentifier, 
    Name varchar(40), 
    CONSTRAINT DF_ID DEFAULT newid() FOR [ID] 
) 
GO 

с ошибкой

Msg 102, Level 15, State 1, Line 5 Неправильный синтаксис около 'для'.

Может ли кто-нибудь предложить, почему возникает эта ошибка, и как использовать полноразмерное определение ограничения по умолчанию?

ответ

1

Ошибка возникает из-за того, что синтаксис ограничения по умолчанию в команде CREATE TABLE отличается от синтаксиса в ALTER TABLE. Просто потому, что команда использует один синтаксис, вы не можете предположить, что он одинаковый для всех команд.

В команде CREATE TABLE синтаксис требует ограничения с по умолчанию, которые будут определены после колонки:

<column_definition> ::=column_name <data_type> 
... 
[ CONSTRAINT constraint_name ] DEFAULT constant_expression ] 
... 

С constant_expression определяется как:

константа, NULL, или которая используется как значение по умолчанию для столбца.

Но в ALTER TABLE синтаксис:

... 
| ADD <table_constraint> 
... 

Синтаксис table_contraint является:

[ CONSTRAINT constraint_name ] 
{ 
    ... 
    | DEFAULT constant_expression FOR column [ WITH VALUES ] 
    ... 
} 

ряд изменений может быть определена в одной ALTER TABLE команды, поэтому имя столбца должно быть указано.

Поэтому нет синтаксиса «полная форма» для CREATE TABLE.

1

Вы должны объявить его рядом с колонкой

CREATE TABLE testGUIDs 
(
    ID uniqueidentifier CONSTRAINT DF_ID DEFAULT newid(), 
    Name varchar(40)  
) 
GO 

ограничение по умолчанию может применяться только к одной колонке.

Грамматика для table_constraint не включает Default, что позволило бы объявить ее в конце.

1
  1. id int PRIMARY KEY может применяться только к однополюсным ПК. Системе присваивается имя по умолчанию. Это проблема, если вам нужно имя позже, чтобы управлять ограничением, и вы не знаете его.
  2. id int CONSTRAINT PK_ID PRIMARY KEY может применяться только к однополюсному ПК.
  3. CONSTRAINT PK_ID PRIMARY KEY(col1, col2) может применяться к составным первичным ключам.

Что касается вашей проблемы: почему бы не использовать встроенный вариант? В любом случае ограничение по умолчанию может применяться только к одному столбцу. Ваш синтаксис просто не поддерживается.

Смежные вопросы