Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何创建具有标识列的表_Sql_Sql Server_Tsql - Fatal编程技术网

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
表中,这对您有什么好处?这里根本不是问题的答案