Sql 如何创建具有标识列的表
我有一个将要吹走的现有表,因为我创建它时没有将Sql 如何创建具有标识列的表,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个将要吹走的现有表,因为我创建它时没有将ID列设置为表的标识列 使用SQL Server Management Studio,我编写了现有表的“创建到…”脚本,并得到以下结果: CREATE TABLE [dbo].[History]( [ID] [int] NOT NULL, [RequestID] [int] NOT NULL, [EmployeeID] [varchar](50) NOT NULL, [DateStamp] [datetime] NOT
ID
列设置为表的标识列
使用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
列设置为标识
[id] [int] IDENTITY(1,1) NOT NULL,
当然,因为您是在SQLServerManagementStudio中创建表的,所以可以使用表设计器来设置标识规范
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]
这已经得到了回答,但我认为最简单的语法是:
CREATE TABLE History (
ID int primary key IDENTITY(1,1) NOT NULL,
. . .
当您实际想要更改选项时,更复杂的约束索引非常有用
顺便说一句,我更喜欢将这样一个列命名为HistoryId,这样它就与外键关系中的列的名称相匹配。Unique key最多允许2个空值。解释:
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')
每次都会出现如下错误:
违反唯一密钥约束“UQ_uuteppp_uu72e12f1b2e1bdc42”。无法在对象“dbo.teppp”中插入重复键。声明已终止
[ID][int]不是空标识(1,1)好的,谢谢Phil。我知道怎么做,但我做不到,因为桌子已经在那里了。我必须删除该表并重新创建它,这就是我使用脚本的原因。@jp2code:我的意思是,您可以创建一个带有标识列的测试表,然后编写脚本,以查看应该如何指定它。我相信这就是我要找的。我不需要将
PK_History
值更改为ID
或任何东西?不,这应该是您所需要的全部,PK_History只是约束的名称。主键约束位于列ID上。参数标识(1,1)标识(种子,增量)的含义是什么OP专门处理GUI工具的输出,该工具输出现有对象的DDL。该工具可能没有“尽可能使用更简单的语法”选项。对于OP的特定情况,最不容易出错的是编辑生成的DDL中的一行,而不是尝试使用最简单的语法从头开始编写。另外,您给出的示例没有像OP那样为PK约束指定名称。许多人更喜欢我的约束名,这样它们在所有环境(开发、测试、产品)中都有相同的名称<代码>ID int constraint PK_History主键标识(1,1)我相信。也许,也许不是。我曾经遇到过这样的情况:我从一个数据库中获取脚本,在另一台服务器上使用它,而在一个地方工作的默认值对另一个地方来说并不是最好的。在任何情况下,我只建议这是一个解决方案,因为它对我来说似乎更简单(我个人理解“主键”关键字比我理解一个约束的选项要好得多,我考虑使用我不理解为“坏”的选项)。然而,您很好地说明了为什么可能会首选另一种解决方案。我应该补充一点,这个答案已经被接受了。@GordonLinoff:Mate,主键默认不为null,为什么需要在这里显式指定不为null?@Learner。这两个约束都在OP的代码中。notnull
是多余的。我需要使ID
列唯一,而不是Name
列。为什么要将唯一约束添加到Name
列?在您的TEPP
表中,这对您有什么好处?这里根本不是问题的答案