【问题标题】:How To Create Table with Identity Column如何使用标识列创建表
【发布时间】:2012-05-30 08:11:43
【问题描述】:

我有一个现有的表,因为我没有创建它并将ID 列设置为表的标识列。

使用 SQL Server Management Studio,我编写了一个现有表的“Create To...” 脚本并得到了这个:

CREATE TABLE [dbo].[History](
    [ID] [int] NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] 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]

我的问题是,我将如何修改此 SQL 以便我的结果表将 ID 列设置为 Identity

【问题讨论】:

  • [ID] [int] NOT NULL IDENTITY(1,1)

标签: sql sql-server tsql


【解决方案1】:
CREATE TABLE [dbo].[History](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] 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]

【讨论】:

  • 我相信这就是我想要的。我不需要将PK_History 值更改为ID 或其他任何东西?
  • 不,这应该是你所需要的,PK_History 只是主键约束已经在列 ID 上的约束的名称
  • 参数IDENTITY(1,1)是什么意思
【解决方案2】:

这已经回答过了,但我认为最简单的语法是:

CREATE TABLE History (
    ID int primary key IDENTITY(1,1) NOT NULL,
    . . .

当您真正想要更改选项时,更复杂的约束索引很有用。

顺便说一下,我更喜欢将这样的列命名为 HistoryId,这样它就可以匹配外键关系中的列名。

【讨论】:

  • OP 专门处理 GUI 工具的输出,该工具输出现有对象的 DDL。该工具可能没有“尽可能使用更简单的语法”选项。对于 OP 的具体情况,最不容易出错的是编辑生成的 DDL 中的一行,而不是尝试使用最简单的语法从头开始编写。此外,您给出的示例也没有像 OP 那样为 PK 约束分配名称。许多人更喜欢我命名的约束,因此它们在所有环境(开发、测试、产品)中都具有相同的名称。 ID int constraint PK_History primary key identity(1,1)我相信。
  • 也许,也许不是。我曾经遇到过从一个数据库中获取脚本,在另一台服务器上使用它的情况,并且在一个地方工作的默认值对另一个地方不是最好的。无论如何,我只建议将此作为解决方案,因为它对我来说似乎更简单(我个人对“主键”关键字的理解比对约束选项的理解要好得多,并且我考虑使用我不理解为“不好的选项” ”)。但是,您很好地说明了为什么可能首选另一种解决方案。我应该补充一下,这个答案已经是公认的答案。
  • @GordonLinoff:伙计,主键默认不为空,为什么要在这里显式指定不为空?
  • @Learner 。 . .这两个约束都在 OP 的代码中。 NOT NULL 是多余的。
【解决方案3】:
[id] [int] IDENTITY(1,1) NOT NULL,

当然,既然您是在 SQL Server Management Studio 中创建表,您可以使用表设计器来设置身份规范。

【讨论】:

  • 好吧,谢谢菲尔。我知道该怎么做,但我不能,因为桌子已经在那里了。我必须删除表并重新创建它,这就是我使用脚本的原因。
  • @jp2code:我的意思是你可以创建一个带有 Identity 列的测试表,然后编写脚本来查看它应该如何指定。
【解决方案4】:

唯一键最多允许 2 个 NULL 值。说明:

create table teppp
(
id int identity(1,1) primary key,
name varchar(10 )unique,
addresss varchar(10)
)

insert into teppp ( name,addresss) values ('','address1')
insert into teppp ( name,addresss) values ('NULL','address2')
insert into teppp ( addresss) values ('address3')

select * from teppp
null string , address1
NULL,address2
NULL,address3

如果您尝试插入与以下相同的值:

insert into teppp ( name,addresss) values ('','address4')
insert into teppp ( name,addresss) values ('NULL','address5')
insert into teppp ( addresss) values ('address6')

每次你都会得到类似的错误:

违反 UNIQUE KEY 约束“UQ__teppp__72E12F1B2E1BDC42”。无法在对象“dbo.teppp”中插入重复键。
该语句已终止。

【讨论】:

  • 我需要使ID唯一,而不是Name 列。为什么要将 unique 约束添加到 Name 列?这对您的teppp 表有什么好处?
  • 这里根本不是问题的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-01
  • 1970-01-01
相关资源
最近更新 更多