SQL Server创建具有IDENTITY COLUMN的表 - 唯一性

时间:2017-04-30 05:23:11

标签: sql-server identity

在SQL Server中,我创建了一个带有ID列的表,我已经创建了一个IDENTITY COLUMN,

EmployeeID int NOT NULL IDENTITY(100,10) PRIMARY KEY

据我了解,当我使用IDENTITY功能时,它会自动增加EmployeeID。我不知道/不确定的是:

  • 是否创建了IDENTITY号码,是唯一的?
  • SQL是否搜索表中的整个列以确认创建的号码是否已存在?
  • 我可以手动覆盖该自动递增编号吗?
  • 如果我手动覆盖该号码,是否会检查我输入的号码以确保它不是重复/现有的ID号码?

感谢您提供的任何帮助。

2 个答案:

答案 0 :(得分:1)

  

是否创建了唯一的IDENTITY号码?

是,Identity属性是唯一的

  

SQL是否搜索表中的整个列以确认创建的数字是否已存在? \

它不需要,这个属性的作用是,只是递增旧值

  

我可以手动覆盖该自动递增编号吗?

是的,你可以。您必须使用SET IDENTITY_INSERT TABLENAME ON

  

如果我手动覆盖该号码,是否会检查我输入的号码以确保它不是重复/现有的ID号码?

不,这不会被SQL Server照顾,你必须确保你有约束来处理这个

以下是一个简单的演示来证明

create table #temp
(
    id int identity(1,1)
)

insert into #temp
default values
go 3

select * from #temp--now id column has 3

set identity_insert  #temp on
insert into #temp (id)
values(4)

set identity_insert  #temp off

select * from #temp--now id column has 4

insert into #temp
default values
go

select * from #temp--now id column has 5,next value from the last highest

从评论中更新信息:
标识列一旦重新设置就会允许间隙,您也无法更新它们

答案 1 :(得分:0)

Q& A

  

Q1:是否创建了IDENTITY号码,是唯一的吗?

答:不,根据SQL Server文档(参见Remarks部分):

  

列上的标识属性不保证以下内容:

     

值的唯一性 - 必须使用a强制执行唯一性   PRIMARY KEY或UNIQUE约束或UNIQUE索引。

请参阅下面的演示,了解在没有UNIQUE索引/约束或没有PRIMARY KEY约束的情况下,我们可以轻松地在IDENTITY列中获取重复值

  

Q2:SQL是否会搜索表中的整个列以确认   创建的号码还不存在?

答:不,根据SQL Server文档(参见Remarks部分):

  

列上的标识属性保证以下内容:

Each new value is generated based on the current seed & increment.

这也意味着,为了计算新的身份值,SQL Server将不会在SELECT MAX(ID) + 1 FROM dbo.TableSELECT MAX(ID) + @increment_value FROM dbo.Table之前执行。

  

问题3:我可以手动覆盖该自动递增号吗?

A1:如果您正在尝试更新具有IDENTITY属性的列,则答案为否,我们无法更新/覆盖IDENTITY列(它没有'}无论SET IDENTITY_INSERT dbo.TableON还是OFF

UPDATE dbo.Test1 
SET ID = 1

Msg 8102, Level 16, State 1, Line 75
Cannot update identity column 'ID'.

此外,我们无法在不重新创建当前表的情况下删除此属性(IDENTITY)。

A2:如果通过"自动递增数字"你了解{当前种子 | "最后IDENTITY插入值" }(ColumnName DataType IDENTITY(seed, increment))然后答案为是(请参阅演示)。

A3:如果通过"自动递增数字"你理解增量号码(ColumnName DataType IDENTITY(seed, increment))然后答案是否。

  

问题4:如果我手动覆盖了该号码,我输入的号码是否可以   检查以确保它不是重复/现有的ID号?

查看Q1和Q4的答案。

<强>演示:

USE tempdb
GO
IF OBJECT_ID('tempdb.dbo.Test1') IS NOT NULL BEGIN DROP TABLE dbo.Test1 END
GO
CREATE TABLE dbo.Test1 (
    ID INT IDENTITY(2, 3), -- There is no UNIQUE index / constraint or PRIMARY KEY constraint defined on ID column
    Col1 VARCHAR(50)
)
GO
INSERT dbo.Test1 (Col1) VALUES ('A'), ('B'), ('C')
SELECT * FROM dbo.Test1
/*
Output:
ID          Col1
----------- ----
2           A
5           B
8           C
*/
GO
-- Method 1 - duplicated values - reseed
DBCC CHECKIDENT('dbo.Test1', RESEED, 2)
/*
Output:
Checking identity information: current identity value '8'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
*/
INSERT dbo.Test1 (Col1) VALUES ('D')
SELECT * FROM dbo.Test1
/*
ID          Col1
----------- ----
2           A
5           B
8           C
5           D   <-- New row
*/
GO 
-- Method 2 - duplicated values - insert duplicated values
SET IDENTITY_INSERT dbo.Test1 ON
GO
INSERT dbo.Test1 (ID, Col1) VALUES (2, 'E'), (8, 'F')
SELECT * FROM dbo.Test1
/*
ID          Col1
----------- ----
2           A
5           B
8           C
5           D
2           E   <-- New row
8           F   <-- New row
*/
GO
-- Method 3 - duplicated values - insert duplicated values
INSERT dbo.Test1 (ID, Col1) VALUES (1, 'A'), (1, 'AA')
SELECT * FROM dbo.Test1
/*
ID          Col1
----------- ----
2           A
5           B
8           C
5           D
2           E
8           F
1           A   <-- New row
1           AA  <-- New row
*/
GO
SET IDENTITY_INSERT dbo.Test1 OFF
GO