0

我将尝试用简单的术语进行解释,而忽略发生这种情况的原因和地点。

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

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

问题与上述混乱无关:)。我想知道在重新启用标识列后,我们将获得种子值

1、2、3、4、5 等和 10001、10002、10003 等。如果插入更多行并且它们从 9999 继续,那么标识列将使用 10,000,然后是 10,004,或者 SQL Server 会在下一次插入时抱怨身份值已被使用?

4

2 回答 2

0

重要的是要认识到,尽管它们经常一起出现,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

PRIMARY KEY如果您尝试插入重复值 a 会抱怨:

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

(与上一个脚本唯一不同的是表名和添加的PRIMARY KEY

结果:

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经常与这两者混为一谈的第三个概念是聚簇索引。一个表完全有可能有一个主键、一个标识列和一个没有共同列的聚集索引。

于 2013-09-04T13:13:48.747 回答
0

我刚刚用简单的 INSERT 测试了这一点:您必须先禁用IDENTITY_INSERT要导入数据的每个表

SET IDENTITY_INSERT table OFF

然后,您可以使用原始标识列值插入数据(您需要这些值才能正确维护引用)

SET IDENTITY_INSERT table ON

SQL Server 继续使用最高元素加一的序列,因此在您的情况下(在插入 ID 10001、10002、10003 之后)它将继续使用 10004。

于 2013-09-04T13:13:50.823 回答