如何解决更改身份列以在SQL Server中添加复合键
我们有一个名为Jam的表,它看起来像这样:
DateTimeCol,Id,A,B,C,so on
Id是一个Identity (1,1)
列,我需要将其更改为带有DateTimeCol
的复合键。我问谷歌如何“更改表更改标识列以添加复合键sql Server”和一些变体,但找不到我想要的内容(即使在SOF上)。
那我该怎么办?
编辑1:为什么要这么做:
数据来自我们控制范围之外的第三方API。几百万行之后,客户端开始崩溃。我们发现ID毕竟不是唯一的。但是,结合日期时间,它是唯一的。
解决方法
可以通过删除现有的主键约束并添加新的约束来向表的主键添加一列。
当前的主键恰好是一个单独的列(即身份)这一事实并不能改变它-但是,它的确带来了各种有趣的问题,在向您展示代码之后,我会问您:>
ALTER TABLE Jam DROP CONSTRAINT pk_Jam;
ALTER TABLE Jam ADD CONSTRAINT pk_Jam PRIMARY KEY (DateTimeCol,Id);
就是这样。现在Jam
表的主键是DateTimeCol
和Id
的组合。
但是:
代理键不应该具有任何商业意义。如果是这样,则说明您使用的是错误的。
假设没有,我宁愿解决导致身份列首先复制值的问题,而不是在主键上添加另一列。
此问题可能是由以下原因之一引起的:
鉴于truncate table
将从表中删除所有行的事实,我非常怀疑这是您要查找的内容。
我会发现最可能的嫌疑人是set identity_insert on
,所以我将开始在您的代码库中寻找这个问题,然后再寻找dbcc checkident(reseed
。
您可能还想阅读我的博客文章SQL Server’s identity column misconceptions
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。