SQLite没有分配主键

时间:2019-03-07 22:21:23

标签: sqlite primary-key schemaspy

我有一个使用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: enter image description here enter image description here

1 个答案:

答案 0 :(得分:1)

  

我不了解CREATE TABLE语句在哪里出了问题   前三个表。

我认为索引CREATE TABLE语句没有错。相反,这似乎是SchemaSpy的不足。

SQLite不会创建索引,因为E_ID,D_ID列(对于META_D和META_G表)都是 rowid 列的别名,可以将其视为MASTER索引(请参见下面的链接)

简而言之,实际上已对该列进行了索引,但是由于内置了索引,因此SQLite无需创建索引(例外情况是表的一种特殊类型,即WITHOUT ROWID表)。

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

您不妨参考ROWIDs and the INTEGER PRIMARY KEY