我刚刚谈到这个非常简单的情况,我需要将主键移动到某个值。假设下表:
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检查?
答案 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)
行。第二次尝试。试试这个:
通过将窗口移动得足够远,可以在更新过程中随时避免重复密钥。