Sql server SQL Server标识列和导入

Sql server SQL Server标识列和导入,sql-server,identity,Sql Server,Identity,我将尝试用简单的术语解释,省去为什么会发生这种情况,以及为什么会发生这种情况 目前有两个数据库需要合并,它们具有相同的表等,在某些情况下,查找表是相同的,在某些情况下,它们是相同的,在某些情况下,一个数据库中的记录在另一个数据库中具有不同的标识值。所以这真是一团糟 假设在其中一个数据库上,我们更新了所有标识值,并向其中添加了10000个标识值并更新了相关记录。然后我们可以按原样导入数据,是的,在某些情况下,查找将具有相同的值两次,并且具有不同的标识 问题不在于上述混乱:)。我想知道在重新启用id

我将尝试用简单的术语解释,省去为什么会发生这种情况,以及为什么会发生这种情况

目前有两个数据库需要合并,它们具有相同的表等,在某些情况下,查找表是相同的,在某些情况下,它们是相同的,在某些情况下,一个数据库中的记录在另一个数据库中具有不同的标识值。所以这真是一团糟

假设在其中一个数据库上,我们更新了所有标识值,并向其中添加了10000个标识值并更新了相关记录。然后我们可以按原样导入数据,是的,在某些情况下,查找将具有相同的值两次,并且具有不同的标识

问题不在于上述混乱:)。我想知道在重新启用identity列后,我们的种子值将为


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继续进行。

谢谢,我也会做一个类似的测试,我感谢您在那里所做的努力,我应该做同样的事情,我很抱歉。感谢您提供了非常有用的信息