【问题标题】:SQLite increment Integer Primary Key and Unique Constraint conflictSQLite增量整数主键和唯一约束冲突
【发布时间】:2017-04-30 09:46:30
【问题描述】:

我有一个 SQLite 数据库。 在编写将行从一个表移动到另一个表的移动行函数时,我需要查询名称为“行”的递增列,即整数主键,但出现错误。在我的任务中使用行进行索引至关重要。示例中的条件是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" 部分。如何克服这个问题?

【问题讨论】:

    标签: c++ sql qt sqlite qsqlquery


    【解决方案1】:

    首先:'4' 不是表名。 UPDATE 语句需要一个表名,您在其中写入了'4'。例如:

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

    第二:当row 显然不是作为主键而是作为一个变化的行号时,不要使用它作为主键(或唯一键,就此而言)。创建一个单独的列,改为用作该表的主索引。

    【讨论】:

      【解决方案2】:

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

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

      SQLite 很可能会按 rowid 顺序处理行,这几乎肯定也是 row 列的递增顺序,因为该列是自动递增的 PK。然后,假设该表包含两行,其 row 值分别为 23。如果它首先处理第一行,那么它会尝试将该行的row 值设置为3,但这会产生约束冲突,因为该列受唯一性约束,并且已经存在一个值为@987654328 的行@ 在该列中。

      如何解决这个问题?

      不要修改 PK 值,尤其是不要修改 surrogate PK 的值,基本上所有自增键都是。

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

      【讨论】:

      • 这对我有用。一个额外的问题。我仍然希望我的“行”列是唯一的。它仍然会重新限制此类查询。可能问题不在自动增量中。
      • @KiskaJoe,你说得对,问题不在于自动增量,但你似乎没有得到重点。 问题是您的更新本质上与受影响列的唯一性约束不兼容。 在所有行都更新后受影响的表是否满足约束并不重要(尽管这就是我解决方法的原因作品)。 SQLite 坚持在您的查询包含的每个单独的行更新之后表满足约束,并且完全有理由期望该要求将失败
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      • 2015-04-22
      相关资源
      最近更新 更多