Sql server SQL Server标识列和导入
我将尝试用简单的术语解释,省去为什么会发生这种情况,以及为什么会发生这种情况 目前有两个数据库需要合并,它们具有相同的表等,在某些情况下,查找表是相同的,在某些情况下,它们是相同的,在某些情况下,一个数据库中的记录在另一个数据库中具有不同的标识值。所以这真是一团糟 假设在其中一个数据库上,我们更新了所有标识值,并向其中添加了10000个标识值并更新了相关记录。然后我们可以按原样导入数据,是的,在某些情况下,查找将具有相同的值两次,并且具有不同的标识 问题不在于上述混乱:)。我想知道在重新启用identity列后,我们的种子值将为Sql server SQL Server标识列和导入,sql-server,identity,Sql Server,Identity,我将尝试用简单的术语解释,省去为什么会发生这种情况,以及为什么会发生这种情况 目前有两个数据库需要合并,它们具有相同的表等,在某些情况下,查找表是相同的,在某些情况下,它们是相同的,在某些情况下,一个数据库中的记录在另一个数据库中具有不同的标识值。所以这真是一团糟 假设在其中一个数据库上,我们更新了所有标识值,并向其中添加了10000个标识值并更新了相关记录。然后我们可以按原样导入数据,是的,在某些情况下,查找将具有相同的值两次,并且具有不同的标识 问题不在于上述混乱:)。我想知道在重新启用id
1、2、3、4、5等和10001、10002、10003等。如果插入更多的行,它们将从9999继续,那么identity列将使用10000,然后是10004,还是SQL Server会在下一次插入时抱怨identity值已被使用?重要的是要意识到,尽管它们经常同时出现,
IDENTITY
和PRIMARY KEY
是两个正交的概念1。因此,对于所问的问题,答案是否定的-因为IDENTITY
列很乐意提供一个已经在同一列中使用的值:
set nocount on
go
create table II (
ID int IDENTITY(1,1) not null,
Value varchar(10) not null
)
insert into II(Value) values ('abc'),('def')
set identity_insert II on
insert into II(ID,Value) values (6,'ghi')
set identity_insert II off
select * from II
insert into II(Value) values ('jkl')
select * from II
GO
dbcc checkident (II, RESEED, 5);
GO
insert into II(Value) values ('mno'),('pqr')
select * from II
结果:
ID Value
----------- ----------
1 abc
2 def
6 ghi
ID Value
----------- ----------
1 abc
2 def
6 ghi
7 jkl
Checking identity information: current identity value '7'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
ID Value
----------- ----------
1 abc
2 def
6 ghi
7 jkl
6 mno
7 pqr
ID Value
----------- ----------
1 abc
2 def
6 ghi
ID Value
----------- ----------
1 abc
2 def
6 ghi
7 jkl
Checking identity information: current identity value '7'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__III__3214EC27FCCBBCB7'. Cannot insert duplicate key in object 'dbo.III'. The duplicate key value is (6).
The statement has been terminated.
ID Value
----------- ----------
1 abc
2 def
6 ghi
7 jkl
然而,如果您试图插入重复值,主键将发出投诉:
create table III (
ID int IDENTITY(1,1) not null PRIMARY KEY,
Value varchar(10) not null
)
insert into III(Value) values ('abc'),('def')
set identity_insert III on
insert into III(ID,Value) values (6,'ghi')
set identity_insert III off
select * from III
insert into III(Value) values ('jkl')
select * from III
GO
dbcc checkident (III, RESEED, 5);
GO
insert into III(Value) values ('mno'),('pqr')
select * from III
go
(与上一个脚本唯一不同的是表名和添加的主键
)
结果:
ID Value
----------- ----------
1 abc
2 def
6 ghi
ID Value
----------- ----------
1 abc
2 def
6 ghi
7 jkl
Checking identity information: current identity value '7'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
ID Value
----------- ----------
1 abc
2 def
6 ghi
7 jkl
6 mno
7 pqr
ID Value
----------- ----------
1 abc
2 def
6 ghi
ID Value
----------- ----------
1 abc
2 def
6 ghi
7 jkl
Checking identity information: current identity value '7'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.
Msg 2627, Level 14, State 1, Line 1
Violation of PRIMARY KEY constraint 'PK__III__3214EC27FCCBBCB7'. Cannot insert duplicate key in object 'dbo.III'. The duplicate key value is (6).
The statement has been terminated.
ID Value
----------- ----------
1 abc
2 def
6 ghi
7 jkl
1经常与这两个概念混淆的第三个概念是聚集索引。一个表完全可能有一个主键、一个标识列和一个没有公共列的聚集索引。我刚刚用简单的INSERT测试了这一点:您必须首先为每个要导入数据的表禁用Identity\u INSERT
SET IDENTITY_INSERT table OFF
然后,可以插入数据及其原始标识列值(为了正确维护引用,需要这些值)
之后
SQL Server以最高的元素加1继续序列,因此在您的情况下(插入ID 10001、10002、10003后),它将以10004继续进行。谢谢,我也会做一个类似的测试,我感谢您在那里所做的努力,我应该做同样的事情,我很抱歉。感谢您提供了非常有用的信息