SQLite增量整数主键和唯一约束冲突

时间:2016-12-14 22:16:24

标签: c++ sql qt sqlite qsqlquery

我有一个SQLite数据库。 当写行移动行函数,它将行从一个表移动到另一个表时,我需要有一个查询来增加名为“row”的列,即INTEGER PRIMARY KEY,但是有一个错误。在我的任务中使用行进行索引至关重要。示例中的条件是WHERE row >= 2,因为我将其他表中的行插入到位置2。

"UPDATE '4' SET row = row + 1 WHERE row >= 2"

Error("19", "Unable to fetch row", "UNIQUE constraint failed: 4.row")

问题的起源WHERE row >= 2"部分。如何克服这个问题?

2 个答案:

答案 0 :(得分:2)

  

问题的起源WHERE row >= 2"部分。

我倾向于不同意。问题不在于更新哪些行,而是更新它们的订单

SQLite很可能会以rowid顺序处理行,这几乎肯定也会增加row列的顺序,因为该列是自动递增的PK。然后,假设该表包含两行row23。如果它首先处理第一行,那么它会尝试将该行的row值设置为3,但这会产生约束违规,因为该列受唯一性约束,并且已经有一行该列中的值为3

  

如何克服这个问题?

不要修改PK值,尤其是不要修改代理 PK的值,这些PK基本上都是自动增量键。

或者,将行更新为临时表,清除原始表,然后将更新后的值复制回其中。如果你有任何引用这个PK的FK,这可能会非常麻烦,但是,请回到我所带领的“不要修改PK值”的建议。

答案 1 :(得分:1)

首先:'4'不是表名。 UPDATE语句需要一个表名为'4'的表名。例如:

UPDATE table1 SET row = row + 1 WHERE row >= 2

第二:当显然不是主键而是更改行号时,不要使用row作为主键(或唯一键)。创建一个单独的列,可以将其用作该表的主索引。