C++ SQLite增量整数主键与唯一约束冲突
我有一个SQLite数据库。 在编写move rows函数(将行从一个表移动到另一个表)时,我需要对名为“row”的列进行递增查询,该列是整数主键,但有一个错误。在我的任务中使用row进行索引是至关重要的。示例中的条件是C++ SQLite增量整数主键与唯一约束冲突,c++,sql,qt,sqlite,qsqlquery,C++,Sql,Qt,Sqlite,Qsqlquery,我有一个SQLite数据库。 在编写move rows函数(将行从一个表移动到另一个表)时,我需要对名为“row”的列进行递增查询,该列是整数主键,但有一个错误。在我的任务中使用row进行索引是至关重要的。示例中的条件是,其中行>=2,因为我正在将其他表中的行插入位置2 “更新'4'设置行=行+1,其中行>=2” 错误(“19”,“无法获取行”,“唯一约束失败:4.行”) 问题的根源是其中行>=2“部分。如何克服此问题?首先:'4'不是表名。UPDATE语句要求您在写入'4'的地方使用表名。例如
,其中行>=2
,因为我正在将其他表中的行插入位置2
“更新'4'设置行=行+1,其中行>=2”
错误(“19”,“无法获取行”,“唯一约束失败:4.行”)
问题的根源是
其中行>=2“
部分。如何克服此问题?首先:'4'
不是表名。UPDATE
语句要求您在写入'4'
的地方使用表名。例如:
UPDATE table1 SET row = row + 1 WHERE row >= 2
第二:不要使用
行
作为主键(或唯一键)当它显然不是主键而是一个不断变化的行号时。创建一个单独的列,可以用作该表的主索引。首先:'4'
不是表名。UPDATE
语句需要一个您写入'4'
的表名。例如:
UPDATE table1 SET row = row + 1 WHERE row >= 2
第二:不要使用行
作为主键(或唯一键),因为它显然不是作为主键而是作为不断变化的行号。创建一个单独的列,可以用作该表的主索引
问题的来源其中行>=2“
部分
我倾向于不同意。问题不在于更新哪些行,而在于更新的顺序
SQLite很可能会以rowid顺序处理行,这几乎肯定也是增加行
列的顺序,因为该列是一个自动递增的PK。那么,假设该表包含两行,分别具有row
值2
和3
。如果它首先处理第一行,则会尝试将该行的行
值设置为3
,但这会产生约束冲突,因为该列受唯一性约束,并且该列中已经有一行的值为3
如何克服这个问题
不要修改PK值,尤其不要修改代理PKs的值,因为实际上所有自动递增键都是
或者,将行更新到临时表中,清除原始表,然后将更新后的值复制回临时表中。但是,如果有任何FK引用此PK,这可能会非常混乱,因此请回到我前面提到的“不要修改PK值”建议
问题的来源其中行>=2“
部分
我倾向于不同意。问题不在于更新哪些行,而在于更新的顺序
SQLite很可能会按rowid顺序处理行,这几乎肯定也是行
列的递增顺序,因为该列是一个自动递增的主键。然后,假设该表包含两行,其中行
值2
和3
。如果它先处理第一行,则会尝试将该行的行
值设置为3
,但这会产生约束冲突,因为该列受唯一性约束,并且该列中已存在一个值为3
的行
如何克服这个问题
不要修改PK值,尤其不要修改代理PKs的值,因为实际上所有自动递增键都是
或者,将行更新到临时表中,清除原始表,然后将更新后的值复制回临时表中。但是,如果有任何FK引用此PK,这可能会非常混乱,因此请返回到我开头的“请勿修改PK值”建议。这对我很有效。还有一个问题。我仍然想要我的“行”“列必须是唯一的。它仍然限制了这种质疑。可能问题不在自动增量中。@KiskaJoe,问题不在自动增量中,你是对的,但你似乎没有抓住要点。问题在于,您的更新本质上与受影响列的唯一性约束不兼容。更新所有行后,受影响的表是否满足约束并不重要(尽管这就是我的变通方法工作的原因)。SQLite坚持在您的查询所包含的每个行更新之后,表都满足约束,并且有充分的理由认为该要求将失败。这对我来说是有效的。还有一个问题。我仍然希望我的“行”列是唯一的。它仍然限制了这种质疑。可能问题不在自动增量中。@KiskaJoe,问题不在自动增量中,你是对的,但你似乎没有抓住要点。问题在于,您的更新本质上与受影响列的唯一性约束不兼容。更新所有行后,受影响的表是否满足约束并不重要(尽管这就是我的变通方法工作的原因)。SQLite坚持在您的查询所包含的每个行更新之后,表都满足约束,并且有充分的理由认为该要求将失败。