微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

更改身份列以在SQL Server中添加复合键

如何解决更改身份列以在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表的主键是DateTimeColId的组合。

但是:

代理键不应该具有任何商业意义。如果是这样,则说明您使用的是错误的。
假设没有,我宁愿解决导致身份列首先复制值的问题,而不是在主键上添加另一列。

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

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

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

您可能还想阅读我的博客文章SQL Server’s identity column misconceptions

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?