如何修复 VACUUM 中的“UNIQUE 约束失败”(INTEGRITY_CHECK 也失败)

问题描述 投票:0回答:1

我使用一个应用程序使用此表创建此 SQLite 数据库:

CREATE TABLE expense_report (_id INTEGER PRIMARY KEY, ...)

由于某种原因,_id(是 ROWID)在该数据库中变得无效。 当我扫描表格时,我看到最后一行有一个 _id ,它很久以前就已经被使用过:

1,2,3...,1137,

1138,...,1147
,1149,...,12263,12264,
1138,...,1148

我在上面突出显示了我看到完全不同的行具有相同 _id 的范围(其余值根本不匹配)。

因此,查询该数据库通常会得到不准确的结果。例如:

SELECT
    (SELECT MAX(_ID) FROM expense_report) DirectMax
    , (SELECT MAX(_ID) FROM (SELECT _ID FROM expense_report ORDER BY _ID DESC)) RealMax;

| DirectMax | RealMax |
| 1148      | 12264   |

通过 DB Browser for SQLite 向此表插入新行也会生成

1149
(而不是
12265
)的 _id,因此如果我继续使用此数据库,问题会变得更糟。

运行 PRAGMA QUICK_CHECK 或 PRAGMA INTEGRITY_CHECK 显示此错误响应:

*** 在数据库主 ***
在第 1598 页上的右子节点: Rowid 12268 乱序

运行 VACUUM 也检测到问题,但似乎无法修复它:

执行完成,但有错误。
结果:UNIQUE 约束失败:expense_report._id

有人知道修复这些重复的 ROWID 值的方法吗?

sqlite duplicates primary-key unique-constraint vacuum
1个回答
0
投票

我最初解决了该数据库的问题,只是恢复到该数据库的旧备份。

但是今天我发现它又出现了(其他记录),最后我通过手动版本修复了它

DB Browser for SQLite

我有这个查询来检查重复行的 ID:

SELECT _id, COUNT(*) c FROM expense_report GROUP BY _id HAVING c > 1;

但是这个特定的查询最初没有返回任何行。之后情况发生了变化:

  1. expense_report
    表中删除了PK。

  2. 运行该查询以再次检查重复行的 ID,现在我得到:

     1506    2
     1507    2
     1508    2
    
  3. 浏览了

    expense_report
    并搜索了每个键,发现它们在金额列中都有不正确的值,并且它们都以
    2022-12
    开头。

  4. 在金额栏中搜索

    2022-12

  5. 选择所有结果(只有那3个坏行)并通过DEL键删除它们。

然后问题中发布的所有查询都可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.