如何用标识列创建表


111

我有一个将要删除的现有表,因为我没有使用将ID列设置为表的Identity列来创建该表。

使用SQL Server Management Studio,我编写了现有表的“创建至...”脚本,并得到了以下信息:

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


11
[ID] [int] NOT NULL IDENTITY(1,1)
Li0liQ 2012年

Answers:


153
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]

1
我相信那是我一直在寻找的东西。我不需要将PK_History值更改为ID或任何其他值吗?
jp2code 2012年

否,那不是您所需要的全部,PK_History只是约束名称,主键约束已经在列ID上了
Gratzy 2012年

1
参数IDENTITY(1,1)的含义是什么
otc


33

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

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

当您实际上要更改选项时,更复杂的约束索引很有用。

顺便说一句,我更喜欢为此类列命名为HistoryId,因此它与外键关系中的列名称匹配。


5
OP专门与GUI工具的输出配合使用,该GUI工具输出现有对象的DDL。该工具可能没有,“如果可能,请使用更简单的语法”选项。对于OP的特定情况,最容易出错的是将编辑生成的DDL中的一行,而不是尝试使用最简单的语法从头开始编写。同样,您给出的示例没有像OP那样为PK约束分配名称。许多人喜欢我的约束命名,因此它们在所有环境(开发,测试,生产)中都具有相同的名称。ID int constraint PK_History primary key identity(1,1)我相信。
香农遣散费

3
也许吧,也许不是。我曾经遇到过从一个数据库中获取脚本,在另一台服务器上使用该脚本的情况,而在一个地方使用的默认值却不适用于另一个地方。无论如何,我只是建议将此作为解决方案,因为它对我来说似乎更简单(我个人理解“主键”关键字比理解约束上的选项要好得多,而且我考虑使用不理解为“坏”的选项。 ”)。但是,您很好地说明了为什么可能首选其他解决方案。我应该补充一点,该答案已经是公认的答案。
Gordon Linoff 2012年

@GordonLinoff:配合,默认情况下主键不为null,为什么您需要在此处显式指定不为null?
学习者

@Learner。。。这两个约束都在OP的代码中。这NOT NULL是多余的。
戈登·利诺夫

12
[id] [int] IDENTITY(1,1) NOT NULL,

当然,由于要在SQL Server Management Studio中创建表,因此可以使用表设计器来设置身份规范。

在此处输入图片说明


1
好吧,谢谢菲尔。我知道该怎么做,但是我不能,因为桌子已经在那儿了。我必须删除表并重新创建它,因此为什么要使用脚本。
jp2code 2012年

4
@ jp2code:我的意思是您可以创建一个带有Identity列的测试表,然后编写脚本以查看应如何指定它。
菲尔(Phil)2012年

-2

唯一键最多允许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列。为什么要向列添加唯一约束Name?这对您的teppp餐桌有什么好处?
jp2code

1
这里根本没有Q的答案
Martin Smith,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.