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

时间:2014-03-19 00:55:53

标签: sql sqlite web-sql

我有一个用

创建的表格
CREATE TABLE `tests` (`num` INTEGER UNIQUE, value VARCHAR(255))

我用它添加两行:

INSERT INTO `tests` VALUES(0, "a")
INSERT INTO `tests` VALUES(1, "b")

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

执行时:

UPDATE `tests` SET `num` = `num` + 1 WHERE `num` >= 0

我收到错误:

由于constaint失败(<19>约束失败)

无法执行语句

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

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

2 个答案:

答案 0 :(得分:4)

如果您没有在临时表的帮助下进行更新,则更新将会起作用:

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;

或者,使用足够大的增量以避免冲突。 然后,您必须再次执行此操作以返回到所需的值:

UPDATE tests SET num = num + 3     WHERE num     >= 0;
UPDATE tests SET num = num - 3 + 1 WHERE num - 3 >= 0;

答案 1 :(得分:-1)

我建议使用IDENTITY约束。使用此约束自动完成递增。

CREATE TABLE test
(
    ID int IDENTITY(1,1) PRIMARY KEY UNIQUE,
    value VARCHAR(255)
)

然后你就可以写了     INSERT INTO测试(值)值('a') 而且你不必担心增量。

Identity(1,1)不是必需的(默认情况下,如果您只是编写标识),但您可以尝试其他组合,如IDENTITY(int a,int b) - 然后从a开始并按b值递增。