【问题标题】:SQL: CONSTRAINT [myPK] PRIMARY KEY [nothing specified here] CLUSTEREDSQL: CONSTRAINT [myPK] PRIMARY KEY [这里没有指定] 集群
【发布时间】:2019-01-25 10:56:38
【问题描述】:

我有这段代码(在 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 字段上的 PRIMARY KEY(并且仅在 Id 上)。

但这就是这里发生的事情吗?因为没有指定字段名称,所以像这样:

CONSTRAINT [PK_tblEStau] PRIMARY KEY (Id) CLUSTERED 

那么,默认情况下,所有列都会包含在此 PRIMARY KEY 中吗?

所以我的问题:

有这个:

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]

已经感谢您的帮助!

【问题讨论】:

  • “如果会发生什么”,为什么不试试看呢?
  • 目前的情况是这个系统非常慢。我不是专家,所以我想知道这段代码实际上做了什么。我不能像那样更改代码,但我只是在调查这个......
  • 在我的数据库系统上,如果我按照指示更改它,我会收到错误消息。如果它对您来说是有效的语法,它可能是特定方言的,所以请添加适当的标签来指示您正在使用的 RDBMS 产品。在您自己的机器上设置该产品的本地实例也是一个非常好的主意,这样您就可以例如不受惩罚地创建新的数据库、表格、视图和实验。通过,你会学到很多东西。

标签: sql sql-server key constraints


【解决方案1】:

在第一个查询中,您确实指定了一个字段列表,即

(
    [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

【讨论】:

  • 您在第一种情况下输入了语法错误...但是:不!所以,这就是我的问题的来源。所以: CONSTRAINT [PK_tblEStau] PRIMARY KEY CLUSTERED 编译,并且: CONSTRAINT [PK_tblEStau] PRIMARY KEY CLUSTERED (ID) 给我一个错误....
  • 在第一个查询中,您确实指定了一个列列表 (([ID] ASC)),因此可以使用。第二个,在“有这个......”之后,给出了一个错误。 i.imgur.com/YFUCfJt.png 。如果你在primary key clustered 之后添加(ID) 也可以。
  • 好的,我明白了!没太注意:([Id] ASC),但是这个语句其实是有的,只是格式不好!
  • 是的,我知道“script table as...”选项会创建这样的脚本,但我不知道为什么它必须在下一行。我同意它属于 PK 的定义并不是很明显。
猜你喜欢
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2016-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多