SQL: CONSTRAINT [myPK] ПЕРВИЧНЫЙ КЛЮЧ [здесь ничего не указано] CLUSTERED - PullRequest
0 голосов
/ 25 января 2019

У меня есть этот код (в MS SQL Server Management Studio 2017):

CREATE TABLE [dbo].[tblEStau](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Status] [nvarchar](20) NULL,
    [ErrorCode] [int] NULL,
    [LastUpdate] [datetime] NULL,
 CONSTRAINT [PK_tblEStau] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

То, что они на самом деле хотели достичь, это ПЕРВИЧНЫЙ КЛЮЧ на поле Id (и только на Id).

Но что здесь происходит?Поскольку имена полей не указаны, что-то вроде этого:

CONSTRAINT [PK_tblEStau] PRIMARY KEY (Id) CLUSTERED 

Будет ли по умолчанию все столбцы участвовать в этом ПЕРВИЧНОМ КЛЮЧЕ?

Итак, мой вопрос:

Имеет это:

CREATE TABLE [dbo].[tblEStau](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Status] [nvarchar](20) NULL,
    [ErrorCode] [int] NULL,
    [LastUpdate] [datetime] NULL,
 CONSTRAINT [PK_tblEStau] PRIMARY KEY CLUSTERED 
) ON [PRIMARY]

тот же эффект, что и этот фрагмент кода:

CREATE TABLE [dbo].[tblEStau](
    [Id] [int] NOT NULL PRIMARY KEY,
    [Status] [nvarchar](20) NULL,
    [ErrorCode] [int] NULL,
    [LastUpdate] [datetime] NULL
) ON [PRIMARY]

Спасибо уже за ваш полезный ответ!

1 Ответ

0 голосов
/ 25 января 2019

В первом запросе у вас do указан список полей, а именно

(
    [Id] ASC
)

ASC означает, что строки хранятся в порядке возрастания, что также является значением по умолчанию.

Следующий код не работает, потому что вы получите синтаксическую ошибку (отсутствует список столбцов):

CREATE TABLE [dbo].[tblEStau](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Status] [nvarchar](20) NULL,
    [ErrorCode] [int] NULL,
    [LastUpdate] [datetime] NULL,
 CONSTRAINT [PK_tblEStau] PRIMARY KEY CLUSTERED 
)

..., но

CREATE TABLE [dbo].[tblEStau](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Status] [nvarchar](20) NULL,
    [ErrorCode] [int] NULL,
    [LastUpdate] [datetime] NULL,
 CONSTRAINT [PK_tblEStau] PRIMARY KEY CLUSTERED (ID)
) ON [PRIMARY]

..Создает почти тот же ключ, что и

CREATE TABLE [dbo].[tblEStau](
    [Id] [int] IDENTITY(1,1) NOT NULL primary key,
    [Status] [nvarchar](20) NULL,
    [ErrorCode] [int] NULL,
    [LastUpdate] [datetime] NULL,
)

Единственное отличие состоит в том, что с помощью CONSTRAINT [PK_tblEStau] PRIMARY KEY CLUSTERED вы указываете имя ключа.С [Id] [int] IDENTITY(1,1) NOT NULL primary key имя вашего ключа получит какой-то идентификатор, например PK__tblEStau__3214EC0769EA2D7C.

...