在SQL Server中,我创建了一个带有ID列的表,我已经创建了一个IDENTITY COLUMN,
EmployeeID int NOT NULL IDENTITY(100,10) PRIMARY KEY
据我了解,当我使用IDENTITY功能时,它会自动增加EmployeeID。我不知道/不确定的是:
感谢您提供的任何帮助。
答案 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.Table
或SELECT MAX(ID) + @increment_value FROM dbo.Table
之前执行。
问题3:我可以手动覆盖该自动递增号吗?
A1:如果您正在尝试更新具有IDENTITY
属性的列,则答案为否,我们无法更新/覆盖IDENTITY
列(它没有'}无论SET IDENTITY_INSERT dbo.Table
是ON
还是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