SQLite没有分配主键

问题描述 投票:0回答:1

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

sqlite primary-key schemaspy
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。

你可以参考qazxsw poi

© www.soinside.com 2019 - 2024. All rights reserved.