HOWTO · SQLite

Temporäre Tabellen in SQLite

In diesem Artikel wird die Erstellung und Verwendung von temporären Tabellen in SQLite ausführlich behandelt.

Auf dieser Seite

Mit temporären Tabellen in SQLite können Sie Zwischendaten während der Arbeit mit einer Datenbank speichern. Erstellen Sie eine Tabelle mit TEMP oder TEMPORARY, fragen Sie ihre Zeilen mit gewöhnlichem SQL ab und ändern Sie sie. Wenn Sie fertig sind, entfernen Sie die Tabelle. Sie gehört zu der Datenbankverbindung, über die sie erstellt wurde, und besteht daher nur so lange wie diese Verbindung.

Eine temporäre Tabelle in SQLite erstellen

Mit CREATE TEMP TABLE oder dem gleichbedeutenden CREATE TEMPORARY TABLE definieren Sie eine temporäre Tabelle. Das folgende Beispiel verwendet das integrierte Python-Modul sqlite3 für einen vollständigen SQLite-Ablauf im Arbeitsspeicher. Eine Quelltabelle ist nur erforderlich, wenn die SELECT-Abfrage in einer Anweisung CREATE TABLE AS SELECT auf eine solche Tabelle zugreift. Sie können eine temporäre Tabelle auch direkt mit Spalten und Werten definieren.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import sqlite3

connection = sqlite3.connect(":memory:")
connection.execute("CREATE TEMP TABLE users (user_id INTEGER, name TEXT, age INTEGER)")
connection.executemany(
    "INSERT INTO users (user_id, name, age) VALUES (?, ?, ?)",
    [(1, "Ari", 30), (2, "Bo", 25)],
)

connection.execute(
    "CREATE TEMP TABLE recent_users AS "
    "SELECT user_id, name FROM users WHERE age >= 18"
)
rows = connection.execute("SELECT user_id, name, age FROM users ORDER BY user_id").fetchall()
print(rows)

connection.execute("UPDATE users SET age = 31 WHERE user_id = 1")
connection.execute("DELETE FROM users WHERE user_id = 2")
connection.execute("DROP TABLE IF EXISTS temp.users")
connection.close()

Das Python-Beispiel erstellt recent_users mit CREATE TEMP TABLE ... AS SELECT, während users auf derselben Verbindung vorhanden ist. SQLite leitet die Spalten der neuen Tabelle aus dem Abfrageergebnis ab. Greift eine Abfrage auf eine Quelltabelle zu, muss diese beim Ausführen der Anweisung bereits vorhanden sein; andernfalls ist keine vorhandene Tabelle erforderlich. TEMP und TEMPORARY sind gleichwertige Schreibweisen. Verwenden Sie am besten durchgehend dieselbe Variante.

Geltungsbereich und Lebensdauer temporärer Tabellen verstehen

SQLite speichert temporäre Tabellen in der temporären Datenbank der jeweiligen Verbindung. Andere Verbindungen können nicht auf diese Tabellen zugreifen, selbst wenn sie dieselbe Datenbankdatei oder denselben Tabellennamen verwenden. Eine temporäre Tabelle wird entfernt, sobald die Verbindung geschlossen wird, der sie gehört. Ihre Lebensdauer richtet sich also nach der Verbindung und nicht nach einer Zeitüberschreitung der Anwendungssitzung. Wird eine Verbindung wiederverwendet, können Sie die Tabelle weiter nutzen, bis Sie die Verbindung schließen oder die Tabelle ausdrücklich löschen.

Temporäre Tabellen eignen sich damit für Zwischenergebnisse, die nicht als dauerhafte Anwendungsdaten gespeichert werden sollen. Wenn Sie eine Verbindung schließen, gehen allerdings auch temporäre Zeilen verloren, die Sie noch benötigen. Übertragen Sie wichtige Ergebnisse in eine dauerhafte Tabelle oder rufen Sie sie ab, bevor Sie die Verbindung schließen.

Eine temporäre Tabelle abfragen

Fragen Sie eine temporäre Tabelle mit der üblichen SELECT-Syntax ab, zum Beispiel mit SELECT user_id, name FROM users WHERE age >= 18;. Wenn kein Konflikt mit einer gleichnamigen dauerhaften Tabelle besteht, greift die Abfrage auf die temporäre Tabelle zu. Um sie eindeutig anzugeben, können Sie den Namen mit temp.users qualifizieren. Die Daten sind nur über die Verbindung verfügbar, der die Tabelle gehört.

Eine Abfrage kann temporäre Daten auch über einen Common Table Expression (CTE) einbeziehen. WITH führt für die Anweisung ein benanntes Abfrageergebnis ein. Die Verwendung ist nicht auf Anweisungen mit nur einer SELECT-Abfrage beschränkt. Zum Beispiel liest die Abfrage WITH adults AS (SELECT user_id, name FROM temp.users WHERE age >= 18) SELECT name FROM adults; Daten aus der temporären Tabelle und gibt die ausgewählten Namen zurück. Wenn ein Zwischenname die Abfrage nicht verständlicher macht, genügt ein direktes SELECT.

Zeilen in einer temporären Tabelle einfügen, aktualisieren und löschen

Verwenden Sie INSERT, UPDATE und DELETE wie bei anderen SQLite-Tabellen und achten Sie darauf, dass jede Anweisung auf die temporäre Tabelle zielt. Mit INSERT INTO temp.users (user_id, name, age) VALUES (3, 'Cy', 28); fügen Sie beispielsweise eine Zeile ein. Um eine bestimmte Zeile zu ändern, verwenden Sie UPDATE temp.users SET age = 29 WHERE user_id = 3;. Die Bedingung WHERE beschränkt die Änderung auf passende Zeilen. Ohne sie würde die Aktualisierung jede Zeile der Zieltabelle betreffen.

Ausgewählte Zeilen entfernen Sie mit DELETE FROM temp.users WHERE user_id = 3;. In der SQLite-Syntax steht nach DELETE kein Sternchen. Lassen Sie WHERE weg, werden alle Zeilen der temporären Tabelle gelöscht, die Tabelle selbst bleibt jedoch bestehen. Diese Anweisungen ändern nur die temporären Daten und nicht eine gleichnamige dauerhafte Tabelle. Wenn die Datenbank zusätzlich eine dauerhafte Tabelle users enthält, geben Sie Ziel und Schema eindeutig an.

Eine temporäre Tabelle sicher löschen

Löschen Sie eine temporäre Tabelle ausdrücklich mit DROP TABLE temp.users;. Der Zusatz temp. gibt das temporäre Schema an und kann verhindern, dass Sie versehentlich eine gleichnamige dauerhafte Tabelle löschen. Falls die Tabelle möglicherweise bereits entfernt wurde, verwenden Sie DROP TABLE IF EXISTS temp.users;. Mit der Klausel IF EXISTS kann die Anweisung auch dann ausgeführt werden, wenn die temporäre Tabelle nicht vorhanden ist.

Übertragen oder lesen Sie alle benötigten Zeilen aus, bevor Sie die Tabelle löschen oder ihre Verbindung schließen. Beim Löschen werden die temporäre Tabelle und ihre Zeilen entfernt; durch das Schließen der zugehörigen Verbindung endet die Lebensdauer der Tabelle ebenfalls. Verwenden Sie eine dauerhafte Tabelle für Daten, die nach dem Schließen der Verbindung verfügbar bleiben müssen.