Sql 如何在不违反约束的情况下增加主键列中的现有值?

Sql 如何在不违反约束的情况下增加主键列中的现有值?,sql,ms-access,Sql,Ms Access,在我的MS Access表myTable中,我有一列ID,该列的类型为integer,是表的主键 我需要将每个ID的值增加一定的偏移量。所以,我试着跑 Update myTable Set ID = ID + [Offset] 此命令适用于非常大的偏移,但如果偏移很小,则以错误结束。原因似乎是Access随机或按升序进行这些更新,这意味着在尝试更新某些行中的值时,将违反主键约束。原因是在更新过程中,生成的ID在特定时间已经存在于表中,但如果查询正确完成,理论上不再存在 与MS Access不

在我的MS Access表
myTable
中,我有一列
ID
,该列的类型为integer,是表的主键

我需要将每个ID的值增加一定的偏移量。所以,我试着跑

Update myTable 
Set ID = ID + [Offset]
此命令适用于非常大的偏移,但如果偏移很小,则以错误结束。原因似乎是Access随机或按升序进行这些更新,这意味着在尝试更新某些行中的值时,将违反主键约束。原因是在更新过程中,生成的ID在特定时间已经存在于表中,但如果查询正确完成,理论上不再存在

与MS Access不同,SQL Server有一个内置的机制来处理这个问题,因此上面的语句可以工作

显然,除了在更新之前删除键约束之外,解决方案是强制访问以降序更新字段,即从最高ID开始向下移动,从而避免重复的可能性。但是,以下命令在MS Access中无效

Update myTable 
Set ID = ID + [Offset] 
Order By ID Desc
旁注:此命令将在MySQL中工作


有没有一种方法可以在不消除关键约束的情况下实现我想要做的事情

也许你可以通过两个更新来实现:

Update myTable Set ID = ID + [Offset] + [HighConstant];
Update myTable Set ID = ID - [HighConstant];

我非常怀疑,您是否可以强制它以任何特定顺序进行
更新。但是,也许您可以编写一个过程,以一次更新一行的顺序遍历ID,从而通过使用多个单行
UPDATE
语句隐式地强制执行处理行的顺序。但是,如果这是值得的努力,而不是仅仅删除和重新创建约束?在两次扫描中执行此操作0)M=Max(id)-Min(id)+1)使用M+偏移向上移动。2) 使用-M将所有内容向下移动最终:更新PK不是一个好方法idea@joop,谢谢,你和图罗同时有同样的想法。更新原因:我正在合并两个相同类型的表,它们都从1开始,现在有重叠的ID。由于FK限制,我不能只接收数据,而必须自己管理密钥,到目前为止,我发现最好的方法是使用偏移量。@stickybit感谢您的评论。删除约束实际上有点棘手,因为它是一个链接表。如果没有其他选择,我最好还是做这个手术。但我很高兴我们找到了另一个解决方案。