我有一个用
创建的表格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中做到这一点?有没有不同的方法可以解决这个问题?
答案 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值递增。