2017-08-21 1 views
1

ich eine Haupttabelle, die SQLite INNER JOIN 2 Tabellen in eine Haupttabelle

CREATE TABLE IF NOT EXISTS filesystem (
    inode   INTEGER PRIMARY KEY, 
    uid    TEXT, 
    gid    TEXT, 
    type   TEXT, 
    pathname  TEXT, 
    parentinode  INTEGER, 
    FileCounter  INTEGER DEFAULT 0, 
    DirCounter  INTEGER DEFAULT 0, 
    TotalByteSum INTEGER DEFAULT 0) 

und 2 Unter Tabellen wie

sieht, die wie folgt aussehen:

CREATE TABLE IF NOT EXISTS groups (
    gid   TEXT PRIMARY KEY, 
    groupname TEXT 

    CREATE TABLE IF NOT EXISTS users (
    uid   TEXT PRIMARY KEY, 
    username TEXT 

Derzeit bin ich mit:

CREATE TABLE completeFileSystem AS SELECT filesystem.inode, users.username, groups.groupname, filesystem.type, filesystem.pathname,filesystem.parentinode, filesystem.FileCounter, filesystem.DirCounter, filesystem.TotalByteSum 
FROM filesystem 
INNER JOIN users ON filesystem.uid = users.uid 
INNER JOIN groups ON groups.gid = filesystem.gid 

erstellt eine neue Tabelle, die dazu führt, dass meine DB-Datei größer als gewünscht ist.

Ich möchte gerne inner join auf filesystem.uid = users.uid und auf filesystem.id = groups.gid in die Dateisystem-Tabelle direkt. Ist das in SQLite möglich? Ich benutze Python, um diese SQL-Anweisungen zu schreiben, wenn sich das ändert.

+0

Er ja, nur die SELECT ohne CREATE TABLE, sicher? –

+0

@Daniel Roseman Das würde innerlich bei einer Abfrage mitmachen. Ich möchte, dass meine Spalte gid und uid direkt in der Dateisystemtabelle aktualisiert wird, um später mehrere Abfragen durchführen zu können. –

+0

Klingt so, als ob Sie ein [view] (https://sqlite.org/lang_createview.html) möchten. –

Antwort

0

Betrachten wir einen Blick für diese Verwendung:

CREATE VIEW completeFileSystem AS 
SELECT ... 
FROM filesystem 
JOIN users USING (uid) 
JOIN groups USING (gid); 

Diese in der Regel schnell genug ist. (Sie können es ein wenig beschleunigen, indem Sie die zwei Nachschlagetabellen WITHOUT ROWID tables machen.) Wenn die Haupttabelle sehr viele Zeilen hat, kann der Raum, der durch das Speichern nur der Benutzer-/Gruppen-IDs gespeichert wird, und somit reduzierte E/A, kompensieren für die Mühe, die Joins zu machen.

Ob das für Ihre spezielle Anwendung eigentlich schnell genug ist, müssen Sie selbst messen.