Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SQLite增量整数主键与唯一约束冲突_C++_Sql_Qt_Sqlite_Qsqlquery - Fatal编程技术网

C++ SQLite增量整数主键与唯一约束冲突

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'的地方使用表名。例如

我有一个SQLite数据库。 在编写move rows函数(将行从一个表移动到另一个表)时,我需要对名为“row”的列进行递增查询,该列是整数主键,但有一个错误。在我的任务中使用row进行索引是至关重要的。示例中的条件是
,其中行>=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坚持在您的查询所包含的每个行更新之后,表都满足约束,并且有充分的理由认为该要求将失败。