Является ли создание некластеризованного синтаксиса PK несовместимым? - PullRequest
1 голос

SQL Server 2008 R2

Почему

create table A
(
   id int,
   primary key nonclustered (id)
)

правильно и выполняется без ошибок?

Но

create table A
(
   id int,
   primary key nonclustered id
)

это ошибка?давая

Неверный синтаксис рядом с ')'.

Дополнительный вопрос:
Почему

create table c(id int primary key clustered)  

выполняется
, но

create table c(id int primary key nonclustered)

является ошибкой? Извините, оба работают.

Является ли несовместимый синтаксис для исправления?

Ответы [ 2 ]

5 голосов
/ 07 ноября 2010

(id) должен быть в скобках.Как ПРОВЕРИТЬ условия и столбцы FOREIGN KEY.В одной строке:

create table A (id int, primary key nonclustered (id)) --ok
create table A (id int, primary key nonclustered id) --not ok

Примечание: запятая подразумевает «ограничение уровня таблицы».Другой синтаксис без запятая означает «ограничение уровня столбца».Конечно, PK для каждой таблицы, у вас могут быть составные ключи, которые не могут быть определены на уровне столбца:

create table A (
   id int,
   something datetime,

   primary key clustered (id,something)
)

Примечание: я всегда буду явно указывать свои ограничения для имен.В противном случае SQL Server генерирует шестнадцатеричный вид.А также явное определение обнуляемости и стиля индекса.Поэтому я написал бы следующее:

create table A (
   id int NOT NULL,
   something datetime NOT NULL,

   CONSTRAINT PK_A PRIMARY KEY CLUSTERED (id,something)
)

Наконец, согласно CREATE TABLE , это нормально и работает на моем экземпляре SQL Server 2008:

 create table c(id int primary key nonclustered)
0 голосов
/ 08 ноября 2010

Скобки необходимы, поскольку в противном случае невозможно было бы отделить список столбцов PRIMARY KEY от того, что следует за ним (это может быть столбец или другое ограничение).

...