我有一个使用sqlite3.exe创建的简单SQLite数据库(代码如下)。当我通过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>
我不明白前三个表中的CREATE TABLE语句有什么问题。
我认为索引CREATE TABLE语句没有任何问题。相反,它似乎是SchemaSpy的缺口。
SQLite没有创建索引,因为没有必要,因为列E_ID,D_ID(对于META_D和META_G表)都是rowid列的别名,可以将其视为MASTER索引(请参阅下面的链接)。
简而言之,列实际上已编入索引,但SQLite无需在内置索引时创建索引(异常是一种特殊类型的表WITHOUT ROWID表)。
因此,索引不会出现在sqlite_master中,因为没有必要,并且看起来SchemaSpy至少按照你配置的方式,并不完全适合SQLite。
你可以参考qazxsw poi