SQLite外键是否自动具有索引?

SQLite外键是否自动具有索引?,sqlite,indexing,foreign-keys,query-optimization,Sqlite,Indexing,Foreign Keys,Query Optimization,我知道SQLite不会以本机方式强制执行外键,但这不是我主要关心的问题。问题是:如果我宣布 CREATE TABLE invoice ( invoiceID INTEGER PRIMARY KEY, clientID INTEGER REFERENCES client(clientID), ... ) sqlite是否至少会使用clientID是外键的信息来优化查询并自动索引invoice.clientID,或者该约束是真正的不可操作?即使它实际上不是不可操作(描述约束的数据结

我知道SQLite不会以本机方式强制执行外键,但这不是我主要关心的问题。问题是:如果我宣布

CREATE TABLE invoice (
  invoiceID INTEGER PRIMARY KEY,
  clientID INTEGER REFERENCES client(clientID),
  ...
  )

sqlite是否至少会使用clientID是外键的信息来优化查询并自动索引invoice.clientID,或者该约束是真正的不可操作?即使它实际上不是不可操作(描述约束的数据结构被添加到表中),与外键相关的语句不会在涉及的列上创建任何索引。 索引仅在主键和唯一语句的情况下隐式创建。 有关更多详细信息,请查看sqlite源代码树上的build.c模块: http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/build.c

在地图上写着:

。。。“应在每个外键约束的子键列上创建索引”


索引不是自动创建的,但你应该在每个实例中创建一个。

啊,我明白了,他们现在明确提到了。谢谢我不知道他们为什么这么说。当然,这取决于您如何使用子表?例如,如果只搜索子表(其他列),然后使用子列(外键)查找父表。@标记它们的解释:每次应用程序从艺术家表(父表)中删除一行时,它执行类似于以下SELECT语句的操作来搜索跟踪表(子表)中的引用行。@jwalker这是真的,但如果您不从父表中删除,该怎么办?@Mark则您不必创建它,但再次声明,如果您曾经开始删除链接,则使用它不会有任何影响。。。将相关部分复制到答案中是个好主意