SQLite не назначает первичные ключи - PullRequest
0 голосов
/ 08 марта 2019

У меня есть простая база данных SQLite, созданная с использованием sqlite3.exe (код приведен ниже).Когда я запускаю его через SchemaSpy, похоже, что в моих первых трех таблицах нет первичных ключей.Я не понимаю, что не так с операторами CREATE TABLE в первых трех таблицах.

Код в:

.open test1.db
PRAGMA foreign_keys = ON;

CREATE TABLE META_E (E_ID INTEGER PRIMARY KEY NOT NULL, E_Name TEXT, Region TEXT, Date DATE);

CREATE TABLE META_D (D_ID INTEGER PRIMARY KEY NOT NULL, Citation TEXT, is_used BOOLEAN);

CREATE TABLE META_G (Completion TEXT, D_ID INTEGER NOT NULL, Location TEXT, PRIMARY KEY (D_ID), FOREIGN KEY (D_ID) REFERENCES META_D (D_ID));

CREATE TABLE P_ID_Main (Source_File TEXT, P_ID INTEGER NOT NULL, E_ID INTEGER NOT NULL, D_ID INTEGER NOT NULL, PRIMARY KEY (P_ID, E_ID, D_ID), FOREIGN KEY (E_ID) REFERENCES META_E (E_ID), FOREIGN KEY (D_ID) REFERENCES META_D (D_ID));

.dump

Дамп:

sqlite> .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
CREATE TABLE META_E (E_ID INTEGER PRIMARY KEY NOT NULL, E_Name TEXT, Region TEXT, Date DATE);
CREATE TABLE META_D (D_ID INTEGER PRIMARY KEY NOT NULL, Citation TEXT, is_used BOOLEAN);
CREATE TABLE META_G (Completion TEXT, D_ID INTEGER NOT NULL, Location TEXT, PRIMARY KEY (D_ID), FOREIGN KEY (D_ID) REFERENCES META_D (D_ID));
CREATE TABLE P_ID_Main (Source_File TEXT, P_ID INTEGER NOT NULL, E_ID INTEGER NOT NULL, D_ID INTEGER NOT NULL, PRIMARY KEY (P_ID, E_ID, D_ID), FOREIGN KEY (E_ID) REFERENCES META_E (E_ID), FOREIGN KEY (D_ID) REFERENCES META_D (D_ID));
COMMIT;
sqlite>

SchemaSpy: enter image description here enter image description here

1 Ответ

1 голос
/ 08 марта 2019

Я не понимаю, что не так с операторами CREATE TABLE в первые три таблицы.

Я считаю, что с индексами нет ничего плохого в инструкциях CREATE TABLE. Скорее всего, это недостаток SchemaSpy.

SQLite не создает индексы, поскольку в этом нет необходимости, поскольку столбцы E_ID, D_ID (для таблиц META_D и META_G) являются псевдонимами столбца rowid , который можно рассматривать как индекс MASTER. (см. Ссылку ниже) .

Короче говоря, столбцы на самом деле индексируются, но SQLite не нужно создавать индекс, поскольку индекс встроен (исключение составляет особый тип таблицы без таблицы ROWID).

Как таковые индексы не будут появляться в sqlite_master, так как в этом нет необходимости, и кажется, что SchemaSpy, по крайней мере, в том виде, в котором вы его настроили, не полностью обслуживает SQLite.

Вы можете сослаться на ROWID и ИНТЕГРИАЛЬНЫЙ ПЕРВИЧНЫЙ КЛЮЧ

...