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

时间:2018-05-31 16:07:59

标签: sql ms-access

在我的MS Access表myTable中,我有一个类{integer}的列ID,它是表的主键。

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

Update myTable 
Set ID = ID + [Offset]

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

与MS Access不同,SQL Server有一个内置的机制来处理它,所以上面的语句可以工作。

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

Update myTable 
Set ID = ID + [Offset] 
Order By ID Desc

旁注:此命令适用于MySQL。

有没有办法在不删除键约束的情况下实现我想要做的事情?

1 个答案:

答案 0 :(得分:3)

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

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