2016-12-14 190 views
0

我有一个SQLite数据库。 在编写移动行函数时,它将行从一个表移动到另一个表中我需要查询增加名为“row”的列,它是INTEGER PRIMARY KEY,但出现错误。在我的任务中对行进行索引非常重要。例如,所述疾病是WHERE row >= 2因为我插入来自其他表行到位置2SQLite增量整数主键和唯一约束冲突

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

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

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

回答

1

第一个:'4'不是表名。 UPDATE声明期望您写入的表名称为'4'。例如:

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

二:只要不使用row作为主键(或唯一键,对于这个问题),当它显然不是意味着作为主键,但作为一个不断变化的行号。创建一个可以用作该表的主索引的单独列。

+0

'4'是正确的表名 – KiskaJoe

2

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

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

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

如何克服这个问题?

不要修改的PK值,特别是不能修改的替代的PK,基本上所有的自动递增键的值。

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

+0

这对我有用。一个额外的问题。我仍然希望我的“行”列是唯一的。它仍然重新提出这样的问题。可能问题不在自动增量中。 – KiskaJoe

+0

@KiskaJoe,你是对的,问题不在于自动增量,但你似乎没有得到主要观点。 **问题是更新的性质本质上与受影响的列的唯一性约束不兼容。**受影响的表在所有行更新后都满足约束并不重要(但这就是我的解决方法)。SQLite坚持认为,在你的查询所包含的每个行更新之后,该表满足约束条件,并且有充分的理由期望该要求将失败*。 –