Frage

SQL Server 2008 R2

Warum

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

ist korrekt und fehlerfrei ausgeführt?

Aber

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

ist ein Fehler aufgetreten? geben

  

falsche Syntax nahe ')'.

Collateral Frage:
Warum

create table c(id int primary key clustered)  

ausgeführt
aber

create table c(id int primary key nonclustered)

ist ein Fehler aufgetreten? Sorry, beide arbeiten.

Ist es inkonsequent Syntax vorgeschlagen zur Korrektur werden?

War es hilfreich?

Lösung

Die (id) sollte in Klammern sein. Wie CHECK-Bedingungen und Fremdschlüsselspalten. Auf einer Zeile:

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

Hinweis: das Komma bedeutet „Tabellenebene Zwang“. Die andere Syntax ohne das Komma bedeutet „Spaltenebene Zwang“. Natürlich PKs pro Tisch sind, können Sie zusammengesetzte Schlüssel haben, die auf Spaltenebene definiert werden können:

create table A (
   id int,
   something datetime,

   primary key clustered (id,something)
)

Hinweis: Ich würde immer über meine Zwänge auch für Namen explizit sein. Ansonsten SQL Server einen Hex schauen erzeugen. Neben explizit definiert NULL-Zulässigkeit und Index-Stil. Also ich dies schreibe würde:

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

   CONSTRAINT PK_A PRIMARY KEY CLUSTERED (id,something)
)

Schließlich ist nach TABLE CREATE, ist dies in Ordnung und Arbeiten auf meiner SQL Server 2008-Instanz:

 create table c(id int primary key nonclustered)

Andere Tipps

Die Klammern sind wichtig, weil sonst gäbe es keine Möglichkeit, die Primärschlüsselspalte Liste abgrenzen von was auch immer es folgt (die eine Spalte oder eine andere Einschränkung sein könnte).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top