身份重置是否必要?

时间:2015-08-17 07:10:25

标签: sql sql-server sql-server-2008

我正在尝试使用Insert...select语句将所有表的数据从一个数据库复制到另一个数据库。

Insert into collist select collist from table

我正在做以下事情

  1. 清除所有表格,截断或删除。
  2. 将数据从源复制到目标(通过执行identity_insert)。
  3. 执行此过程后,我们是否需要在将数据复制到目标数据库后再次重置身份?

3 个答案:

答案 0 :(得分:1)

我认为您不需要重置IDENTITY列。重置IDENTITY列可能会导致违规行为。假设您的IDENTITY列是PK

CREATE TABLE aa(
    id INT IDENTITY(1, 1) PRIMARY KEY, 
    x INT
)
INSERT INTO aa(x) VALUES (1), (2);

您的数据现在看起来像这样:

id          x
----------- -----------
1           1
2           2

然后,您重置IDENTITY

DBCC CHECKIDENT ('aa', RESEED, 0)

当您在表中插入新行时,会发生PK违规错误:

INSERT INTO aa(x) VALUES (3), (4);
  

Ms 2627,Level 14,State 1,Line 8违反PRIMARY KEY   约束'PK__aa__3213E83F76F5681B'。无法插入重复键   对象'dbo.aa'。重复键值为(1)。

Aaron Bertrand对重置IDENTITY专栏有很好的见解。有关详细信息,请参阅here

答案 1 :(得分:0)

这取决于列配置。如果您在标识列上没有主键和唯一键约束,则可以重置标识。但是,这会导致重复值。

如果您没有重置,则会插入下一条记录,并以(maxvalue of column in identity column)+1作为标识值。

希望这有帮助!

答案 2 :(得分:0)

从数据的角度来看,身份值应该毫无意义 这意味着标识列的值不应该是数据的一部分,而应该只是行标识符。

当你有查询表(id,name)或数据表时,它们非常有用,其中行唯一性由多个列组成,你需要在关系中使用这些表 - 在这些表中有一个标识列作为代理键情况可以为你和你的数据库节省大量的工作。

指定列作为标识保证几乎任何东西 - 甚至不是唯一性 - 因为您可以使用SET IDENTITY INSERT tableName ON并手动插入您想要的任何值,甚至是重复值(除非该列上有唯一约束或索引,当然)。

身份只是数据库提供的一种机制,用于简化关系和代理密钥处理。

话虽如此,你真的不应该重置身份值。