0

我有一个使用 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>

模式间谍: 在此处输入图像描述 在此处输入图像描述

4

1 回答 1

1

我不明白前三个表中的 CREATE TABLE 语句有什么问题。

我认为 CREATE TABLE 语句没有任何问题。相反,它似乎是 SchemaSpy 的不足。

SQLite 没有创建索引,因为没有必要,因为列 E_ID、D_ID(对于 META_D 和 META_G 表)是rowid列的别名,可以被视为 MASTER 索引(参见下面的链接)

简而言之,列实际上是索引的,但 SQLite 不需要创建索引,因为索引是内置的(一个例外是特殊类型的表,即 WITHOUT ROWID 表)。

因此,索引不会出现在 sqlite_master 中,因为没有必要,而且看起来 SchemaSpy 至少按照您配置的方式,并不能完全满足 SQLite。

您可能希望参考ROWID 和 INTEGER PRIMARY KEY

于 2019-03-08T08:06:04.557 回答