【问题标题】:SQLite "INDEXED BY" not working in SELECTSQLite“INDEXED BY”在 SELECT 中不起作用
【发布时间】:2014-11-30 12:10:23
【问题描述】:

我有一个 Tune 表,其中包含一个 _id 字段和一个 MD5 字段.. 以及与此问题无关的其他字段。当我执行以下语句时,我会恢复我的 MD5 值:

SELECT MD5 FROM Tune WHERE _id='5'

我有一个索引 ITUNEID,我尝试使用它来加快定位曲调记录:

CREATE INDEX ITUNEID ON Tune (_id)

当我使用以下语句时,我收到“无查询解决方案”错误。

SELECT MD5 FROM Tune INDEXED BY ITUNEID WHERE _id='5'

上述说法有什么问题?

我忘了说 _id 是主键。这就是问题所在吗?在涉及主键的地方指定使用索引是否违法?

【问题讨论】:

  • 抛开贴出来的问题,为什么觉得这里需要指定索引呢?如果是主键,SQLite 应该会自动选择正确的索引。
  • @LasseV.Karlsen:那是我的误解——我没有意识到它实际上是一个主键。我不明白为什么 INDEXED BY 在我的代码的其他地方工作而不是这个查询。只是想通过 SQL 语句稍微优化一下代码。
  • INDEXED BY 的文档有这样的文字:“...必须使用命名索引才能在前面的表中查找值”,是否该索引必须包含MD5 列也是?
  • “普通”主键和INTEGER PRIMARY KEY 之间存在差异。
  • @LasseV.Karlsen:我不这么认为。我在我的应用程序中使用了大约 10 个不同的索引(索引?),它们都运行良好。只有这个我使用了 _id 没有工作。顺便说一句,我不是 SQL 大师 :)

标签: sql sqlite select indexing


【解决方案1】:

我遇到了同样的问题 - 但有额外的上下文。可悲的是,在 2021 年仍然很重要。

错误sqlite3.OperationalError: no query solution 仅在 Python 中引发(在我的情况下为 3.8.6,因此 SQLite 3.32.3),但在 SQLite 3.12.1 (SQLite 3.33.0) 的 DB Browser 中未引发。

所以我检查了更新的 Python 版本(3.9.2 - SQLite 3.34.0),问题就消失了。

我好像这个问题只存在于3.33.0以下的SQLite上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-06
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多