我使用一个应用程序使用此表创建此 SQLite 数据库:
CREATE TABLE expense_report (_id INTEGER PRIMARY KEY, ...)
由于某种原因,_id(是 ROWID)在该数据库中变得无效。 当我扫描表格时,我看到最后一行有一个 _id ,它很久以前就已经被使用过:
1,2,3...,1137,
,1149,...,12263,12264,1138,...,1147
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 值的方法吗?
我最初解决了该数据库的问题,只是恢复到该数据库的旧备份。
但是今天我发现它又出现了(其他记录),最后我通过手动版本修复了它
DB Browser for SQLite
。
我有这个查询来检查重复行的 ID:
SELECT _id, COUNT(*) c FROM expense_report GROUP BY _id HAVING c > 1;
但是这个特定的查询最初没有返回任何行。之后情况发生了变化:
从
expense_report
表中删除了PK。
运行该查询以再次检查重复行的 ID,现在我得到:
1506 2
1507 2
1508 2
浏览了
expense_report
并搜索了每个键,发现它们在金额列中都有不正确的值,并且它们都以2022-12
开头。
在金额栏中搜索
2022-12
。
选择所有结果(只有那3个坏行)并通过DEL键删除它们。
然后问题中发布的所有查询都可以正常工作。