更新主键而不触发唯一键冲突

时间:2011-03-18 15:34:29

标签: sql sqlite

我刚刚谈到这个非常简单的情况,我需要将主键移动到某个值。假设下表:

CREATE TABLE Test (
 Id INTEGER PRIMARY KEY,
 Desc TEXT);

加载以下值:

INSERT INTO Test VALUES (0,'one');
INSERT INTO Test VALUES (1,'two');

如果尝试更新主键,它当然会失败:

UPDATE Test SET Id = Id+1;
  

错误:列ID不唯一

在更新查询运行之后,有没有办法暂停unicity检查?

3 个答案:

答案 0 :(得分:7)

找到一个不错的支点,并围绕该支点移动数据。例如,如果您的所有ID都是正数,则良好的数据透视为0。

通常情况下

UPDATE Test SET Id = Id+1;

改为执行此序列

UPDATE Test SET Id = -Id;
UPDATE Test SET Id = -Id +1;

有时候,你可以找到一个类似的支点,但公式只是一点点。

答案 1 :(得分:1)

没有理解基本问题(是的,你似乎是代码的受害者并在这个问题上运行!),将ID乘以表中的最大值应该可行。

update test
set id = id * (select max(id) + 1 from test)

然而,它很脏,实际上,数据库因为某种原因而难以更改主键...

答案 2 :(得分:0)

行。第二次尝试。试试这个:

  1. 获取键列的最大值。
  2. 更新表SET键=键+最大+ 1
  3. 更新表SET键=键 - 最大
  4. 通过将窗口移动得足够远,可以在更新过程中随时避免重复密钥。