首页 > 解决方案 > 更改标识列以在 SQL Server 中添加复合键

问题描述

我们有一个名为让我们说 Jam 的表,它看起来像这样:

DateTimeCol,
Id,
A,
B,
C, so on

Id 是一Identity (1,1)列,我需要将其更改为复合键DateTimeCol。我问谷歌如何“改变表改变标识列添加复合键 SQL Server”和一些变体,但我找不到我要找的东西(即使在 SOF 上)。

那么我该怎么做呢?

编辑1:我们为什么要这样做:

数据来自我们无法控制的第三方 API。在几百万行之后,客户端开始崩溃。我们发现 Id 毕竟不是唯一的。然而,结合日期时间,它是独一无二的。

标签: sqlsql-server

解决方案


可以通过删除现有的主键约束并添加一个新约束来向表的主键添加一列。
当前主键恰好是一个标识列这一事实并没有改变这一点 - 但是,它确实带来了各种有趣的问题,我会在向您展示代码后问您:

ALTER TABLE Jam DROP CONSTRAINT pk_Jam;

ALTER TABLE Jam ADD CONSTRAINT pk_Jam PRIMARY KEY (DateTimeCol, Id);

而已。现在Jam表的主键是 和 的DateTimeCol组合Id

然而:

代理键不应该有任何商业意义。如果是这样,你就用错了。
假设它没有,我宁愿首先解决导致标识列重复值的问题,而不是向主键添加另一列。

此问题可能是由以下原因之一引起的:

  1. 使用set identity_insert on
  2. 使用dbcc checkident(reseed, x)
  3. 使用truncate table

鉴于truncate table将从表中删除所有行的事实,我非常怀疑这是您要查找的内容。
我会发现最有可能的嫌疑人,set identity_insert on所以我会开始在你的代码库中寻找这个,然后寻找dbcc checkident(reseed.

您可能还想阅读我的博客文章,题为SQL Server 的标识列误解


推荐阅读