SQLITE_CORRUPT table 错误,UNIQUE 索引包含使用 DbVisualizer 的 COALESCE()
SQLITE_CORRUPT error on table with UNIQUE index containing COALESCE() using DbVisualizer
一位同事通过添加 COALESCE 以在唯一约束中强制执行 NULL 值,创建了一个带有奇怪 UNIQUE 键(以绕过 NULL 处理)的 table。我在尝试使用 DbVisualizer Pro 打开数据库时收到以下错误,但在使用 SQLite Expert Professional 时似乎可以正常打开(我正在试用它们):
SQLITE_CORRUPT: The database disk image is malformed (malformed database schema (ux_test) - near "(": 语法错误)
DDL:
创建 TABLE 测试 (
Id 整数 NOT NULL PRIMARY KEY AUTOINCREMENT,
val1 整数,
val2 整数,
val3 整数
);</p>
<p>在测试时创建唯一索引ux_test(val1, COALESCE(val2, -1), COALESCE(val3, -1));
我就此问题向 DbVisualizer 支持寻求帮助,并被告知这是一个 SQLite 错误。任何人都可以对此提供任何见解吗?仅供参考,由于 SQLite 处理 NULL 值的方式,COALESCE() 位于唯一键中;它在约束中看不到 NULL 值相等。此外,如果满足约束,他们更喜欢使用 INSERT OR REPLACE INTO
,因此 BEFORE
触发器将不起作用。
谢谢。
编辑:CL 的回答(下方)似乎是问题所在; DbVisualizer Pro 使用 SQLite 3.8.11 版,而当前版本为 3.18.0。我正在尝试查看是否可以获得对所用 dll 的更新,因为它确实是一个很棒的应用程序。谢谢!
The ability to index expressions was added to SQLite with version 3.9.0 (2015-10-14). A database that uses an index on expressions will not be usable by earlier versions of SQLite.
显然,您的 DbVisualizer 已经过时了。
一位同事通过添加 COALESCE 以在唯一约束中强制执行 NULL 值,创建了一个带有奇怪 UNIQUE 键(以绕过 NULL 处理)的 table。我在尝试使用 DbVisualizer Pro 打开数据库时收到以下错误,但在使用 SQLite Expert Professional 时似乎可以正常打开(我正在试用它们):
SQLITE_CORRUPT: The database disk image is malformed (malformed database schema (ux_test) - near "(": 语法错误)
DDL:
创建 TABLE 测试 (
Id 整数 NOT NULL PRIMARY KEY AUTOINCREMENT,
val1 整数,
val2 整数,
val3 整数
);</p>
<p>在测试时创建唯一索引ux_test(val1, COALESCE(val2, -1), COALESCE(val3, -1));
我就此问题向 DbVisualizer 支持寻求帮助,并被告知这是一个 SQLite 错误。任何人都可以对此提供任何见解吗?仅供参考,由于 SQLite 处理 NULL 值的方式,COALESCE() 位于唯一键中;它在约束中看不到 NULL 值相等。此外,如果满足约束,他们更喜欢使用 INSERT OR REPLACE INTO
,因此 BEFORE
触发器将不起作用。
谢谢。
编辑:CL 的回答(下方)似乎是问题所在; DbVisualizer Pro 使用 SQLite 3.8.11 版,而当前版本为 3.18.0。我正在尝试查看是否可以获得对所用 dll 的更新,因为它确实是一个很棒的应用程序。谢谢!
The ability to index expressions was added to SQLite with version 3.9.0 (2015-10-14). A database that uses an index on expressions will not be usable by earlier versions of SQLite.
显然,您的 DbVisualizer 已经过时了。