我有一个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"
部分。如何克服这个问题?
答案 0 :(得分:2)
问题的起源
WHERE row >= 2"
部分。
我倾向于不同意。问题不在于更新哪些行,而是更新它们的订单。
SQLite很可能会以rowid顺序处理行,这几乎肯定也会增加row
列的顺序,因为该列是自动递增的PK。然后,假设该表包含两行row
值2
和3
。如果它首先处理第一行,那么它会尝试将该行的row
值设置为3
,但这会产生约束违规,因为该列受唯一性约束,并且已经有一行该列中的值为3
。
如何克服这个问题?
不要修改PK值,尤其是不要修改代理 PK的值,这些PK基本上都是自动增量键。
或者,将行更新为临时表,清除原始表,然后将更新后的值复制回其中。如果你有任何引用这个PK的FK,这可能会非常麻烦,但是,请回到我所带领的“不要修改PK值”的建议。
答案 1 :(得分:1)
首先:'4'
不是表名。 UPDATE
语句需要一个表名为'4'
的表名。例如:
UPDATE table1 SET row = row + 1 WHERE row >= 2
第二:当显然不是主键而是更改行号时,不要使用row
作为主键(或唯一键)。创建一个单独的列,可以将其用作该表的主索引。