SQLite 没有分配主键
SQLite is not assigning primary keys
我有一个使用 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>
SchemaSpy:
I don't understand what is wrong with the CREATE TABLE statements in
the first three tables.
我认为 CREATE TABLE 语句没有错。相反,它似乎是 SchemaSpy 的不足。
SQLite 没有创建索引,因为不需要 E_ID、D_ID 列(对于 META_D 和 META_G table s) 是 rowid 列的别名,可以将其视为 MASTER 索引 (参见下面的 link)。
简而言之,该列实际上已编入索引,但 SQLite 不需要创建索引,因为索引是内置的(例外是一种特殊类型 table a WITHOUT ROWID table).
因此,索引不会出现在 sqlite_master 中,因为没有必要,而且看起来 SchemaSpy 至少按照您配置的方式并不能完全满足 SQLite 的要求。
我有一个使用 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>
SchemaSpy:
I don't understand what is wrong with the CREATE TABLE statements in the first three tables.
我认为 CREATE TABLE 语句没有错。相反,它似乎是 SchemaSpy 的不足。
SQLite 没有创建索引,因为不需要 E_ID、D_ID 列(对于 META_D 和 META_G table s) 是 rowid 列的别名,可以将其视为 MASTER 索引 (参见下面的 link)。
简而言之,该列实际上已编入索引,但 SQLite 不需要创建索引,因为索引是内置的(例外是一种特殊类型 table a WITHOUT ROWID table).
因此,索引不会出现在 sqlite_master 中,因为没有必要,而且看起来 SchemaSpy 至少按照您配置的方式并不能完全满足 SQLite 的要求。