【问题标题】:Does a SQLite Foreign key automatically have an index?SQLite 外键是否自动具有索引?
【发布时间】:2010-10-31 14:33:16
【问题描述】:

我知道 SQLite 本身并不强制执行外键,但这不是我主要关心的问题。问题是:如果我声明

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

sqlite 至少会使用 clientID 是外键的信息来优化查询并自动索引 invoice.clientID,还是这个约束是真正的无操作?

【问题讨论】:

    标签: sqlite indexing foreign-keys query-optimization


    【解决方案1】:

    即使它实际上不是空操作(将描述约束的数据结构添加到表中),外键相关语句也不会在相关列上创建任何索引。 只有在 PRIMARY KEY 和 UNIQUE 语句的情况下才会隐式创建索引。 有关更多详细信息,请查看 sqlite 源代码树上的 build.c 模块: http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/build.c https://www.sqlite.org/src/file?name=src/build.c&ci=tip

    【讨论】:

    • 链接已失效...将相关部分复制到答案中是个好主意
    【解决方案2】:

    SQLite Documentation 中写道:

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

    即。索引不会自动创建,但您应该在每个实例中创建一个。

    【讨论】:

    • 啊,我明白了,他们现在明确提到了。谢谢!
    • 我不知道他们为什么这么说。当然,这取决于您如何使用子表?例如,如果您只搜索子表(其他一些列),然后使用子列(外键)查找父表。
    • @Mark 他们解释说:每次应用程序从艺术家表(父表)中删除一行时,它都会执行相当于以下 SELECT 语句来搜索引用行跟踪表(子表)。
    • @jwalker 确实如此,但是如果您不从父表中删除呢?
    • @Mark 那你不必创建它,但话又说回来,万一你开始删除它不会有什么坏处
    猜你喜欢
    • 2010-09-23
    • 1970-01-01
    • 2010-09-21
    • 2011-03-04
    • 2011-07-01
    • 2018-07-14
    • 2021-01-08
    • 2015-01-04
    相关资源
    最近更新 更多