Оптимизация внешнего ключа в SQLite
Я знаю, что SQLite не использует внешние ключи изначально, но это не моя основная проблема. Возникает вопрос: если я объявляю
CREATE TABLE invoice (
invoiceID INTEGER PRIMARY KEY,
clientID INTEGER REFERENCES client(clientID),
...
)
будет sqlite хотя бы использовать информацию о том, что clientID является внешним ключом для оптимизации запросов и автоматически индексирует invoice.clientID, или это ограничение является реальным no-op?
Ответы
Ответ 1
Даже если на самом деле это не-op (структура данных, описывающая ограничение, добавляется в таблицу), оператор внешнего ключа не создает никакого индекса для задействованных столбцов.
Индексы неявно создаются только в случае PRIMARY KEY и UNIQUE.
Для получения дополнительной информации проверьте его модуль build.c в дереве исходных данных sqlite:
http://www.sqlite.org/cvstrac/rlog?f=sqlite/src/build.c
Ответ 2
В документации SQLite говорится:
... "должен быть создан индекс в столбцах дочернего ключа каждого ограничения внешнего ключа"
т. индекс не создается автоматически, но вы должны создать его в каждом экземпляре.