使用唯一键增加表中的值会导致约束错误

Eli*_*ite 3 sql sqlite web-sql

我创建了一个表

CREATE TABLE `tests` (`num` INTEGER UNIQUE, value VARCHAR(255))
Run Code Online (Sandbox Code Playgroud)

我向其中添加两行:

INSERT INTO `tests` VALUES(0, "a")
INSERT INTO `tests` VALUES(1, "b")
Run Code Online (Sandbox Code Playgroud)

我现在的目标是插入num= 0 的行,但为了能够做到这一点,我需要上移这两行上的索引。

当我执行时:

UPDATE `tests` SET `num` = `num` + 1 WHERE `num` >= 0
Run Code Online (Sandbox Code Playgroud)

我收到错误:

由于约束失败而无法执行语句(19 约束失败)

我的猜测是,它正在增加每一行,当它通过将其设置为 来增加第一行时1,已经有一行带有numof 1,因此失败。

在标准代码中,这可以通过向后迭代集合来解决,在 Sqlite 中有没有办法做到这一点?有没有不同的方法来解决这个问题?

CL.*_*CL. 6

如果您不就地进行更新而是在临时表的帮助下进行更新,则更新将起作用:

CREATE TEMP TABLE t2 AS SELECT * FROM tests WHERE num >= 0;
DELETE FROM tests WHERE num >= 0;
INSERT INTO tests SELECT num + 1, value FROM t2;
DROP TABLE t2;
Run Code Online (Sandbox Code Playgroud)

或者,使用足够大的增量,以免发生冲突。然后您必须再次执行此操作才能恢复到所需的值:

UPDATE tests SET num = num + 3     WHERE num     >= 0;
UPDATE tests SET num = num - 3 + 1 WHERE num - 3 >= 0;
Run Code Online (Sandbox Code Playgroud)