在sqlite中创建索引时出现操作错误

6

编辑:简要版

我输入了这个。

CREATE INDEX IF NOT EXISTS IDX_FILE_SIZE table_name (file_size); 

与其这样

CREATE INDEX IF NOT EXISTS IDX_FILE_SIZE ON table_name (file_size); 

不要这样做。


-1:代码太多了。你能把它缩减到只显示问题的代码吗?最小化展示出现错误的SQL语句?然后用简短、简洁的代码样本替换掉冗长的代码样本吗? - S.Lott
1
除了错误处理和sql之外,那里有14行代码。我花了一个小时将代码缩短到这个地步,这是我能够获得错误的最小值。 - Nathan Spears
@Nathan Spears:很勇敢,但问题仍然很大。那些“testIndexes”代码是什么?还有那些“verifyIndexes”代码呢?你能否将你在这里发布的代码量减少到最小,以便最简单地展示问题。 - S.Lott
@S.Lott:做 OP 应该做的事情:冷静下来,放慢速度,仔细阅读问题开头的 CREATE INDEX 语句,如果你在到达第六个 CREATE INDEX 语句时还没发现问题所在的那一行,请返回步骤1。如果这样不起作用,请阅读我的答案。 - John Machin
问题在于我缺少了一个ON关键字。在花费了一个小时的时间重新排列代码和脚本的每一个可能的方式,同时忽略了显而易见的错误之后,我有了一个测试函数和几个验证函数。因为我没有看到那一行的差异,所以我认为问题与我运行Python代码的方式或脚本顺序或某些神秘的东西有关,这就是为什么我发布了所有内容的原因。你是对的,我应该更加缩小问题的范围,但这就陷入了进退两难的境地:如果我正确地缩小了问题的范围,我就不会在这里发布它了。 - Nathan Spears
@Nathan Spears:你没有理解我的观点。其他人也会阅读这些问题并希望从中学习。你能否缩小问题的范围,以最少的代码展示问题。这不是进退两难的情况。有时候,缩小问题的范围可以让你为自己解决问题,这是好的。但缩小范围也有助于其他人从你的经验中学习。有时候也会让你为自己解决问题。 - S.Lott
1个回答

5

一些愚蠢的问题:

是否巧合,有冒犯性语句中缺少单词ON

CREATE INDEX IF NOT EXISTS IDX_FILE_FULLPATH_FILE_PARENT_DIR ON table_name (file_fullpath, file_parent_dir);
CREATE INDEX IF NOT EXISTS IDX_FILE_SIZE table_name (file_size); -- 缺少ON
CREATE INDEX IF NOT EXISTS IDX_TAG_TITLE ON table_name (tag_title);

在您的问题的所有冗长文字中,我是否看到了“语法错误”这个短语?

您是否尝试过在sqlite3命令解释器中运行SQL语句并查看实际获取的哪个语法错误?

例如:

SQLite version 3.6.14
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table foo (bar int, zot int);
sqlite> create index barx on foo(bar);
sqlite> create index zotx    foo(zot);
SQL error: near "foo": syntax error
sqlite>

您有没有考虑查看文档中的TFRRD(The Fantastic Rail-Road Diagram)?链接

您写道:“当我在较小的脚本(verifyIndexSmaller)中运行该命令时,它没有错误。如果我再次尝试运行较大的脚本,即使索引已经被较小的脚本创建,我仍然会收到错误。”

您是否考虑过可能是因为您并没有在较小的脚本中运行该命令,而实际上运行了另一个(已修复!)版本的该命令?

现在您明白为什么S.Lott试图让您去掉无用的话语,专注于导致错误的SQL语句了吗?


这并不是巧合,但我盯着它看了太久,没有看到缺少什么。在我的原始帖子中,我非常清楚地概述了sql问题所在。我已经逐行拆分脚本并单独运行每行,这就是我找出问题所在的方式,但不知怎么的,我竟然没有发现缺失的关键字。我甚至认为我已经将工作脚本中的行复制粘贴到"坏掉的脚本"中,但很明显我没有这样做。感谢你的第二双眼睛! - Nathan Spears

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接