sql - 更改标识列以在 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 的标识列误解
推荐阅读
- android - 你能说哪个更好,DialogFragment 还是 AlertDialog?
- vb.net - 为什么我在连接 mysql 时在 Vb.net 中收到此错误“从字符串转换为类型 'Double' 无效”?
- android - 我可以在 PeriodicWorkRequestBuilder 中每次启动 doWork() 更改输入数据吗
- amazon-web-services - 我想使用 Python (Boto3) 以 CSV 格式将 DynamoDB 表导出到 S3 存储桶
- javascript - 有没有更惯用的方法在 TypeScript/JavaScript 中创建构建器函数属性?
- python - tf.estimator input_fn 和急切模式
- java - Android Studio中Java的Clojure单元测试?
- jquery - jQuery - 使用 :after 从 CSS 获取图像
- reactjs - 如何在组件之间传递状态变量
- python - 在 python 中将 int 转换为 str 会产生 TypeError