Fremdschlüssel und ON DELETE CASCADE in SQLite
Ein Fremdschlüssel sorgt dafür, dass keine verwaisten Zeilen entstehen – und mit ON DELETE CASCADE räumt die Datenbank abhängige Daten automatisch mit auf. Wichtig bei SQLite: Du musst die Prüfung pro Verbindung erst einschalten.
In meinen Projekten läuft die Datenbank fast immer auf SQLite. Ein Detail, das dort gern übersehen wird: Fremdschlüssel-Prüfungen sind standardmäßig aus. Wer sie will (und das solltest du), muss sie pro Verbindung aktivieren.
Erst einschalten
PRAGMA foreign_keys = ON;Das gilt pro Verbindung – setze es direkt nach dem Öffnen der Datenbank in deinem Code, nicht nur einmal in der Datei. Ohne das akzeptiert SQLite auch verwaiste Verweise klaglos.
Fremdschlüssel definieren
CREATE TABLE nutzer (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE beitrag (
id INTEGER PRIMARY KEY,
nutzer_id INTEGER NOT NULL,
text TEXT,
FOREIGN KEY (nutzer_id) REFERENCES nutzer(id) ON DELETE CASCADE
);Der Fremdschlüssel garantiert: In beitrag.nutzer_id darf nur eine existierende nutzer.id stehen. Ein Beitrag ohne gültigen Nutzer wird abgelehnt.
ON DELETE CASCADE – automatisch aufräumen
Der Zusatz ON DELETE CASCADE beantwortet die Frage „was passiert mit den Beiträgen, wenn ich einen Nutzer lösche?":
DELETE FROM nutzer WHERE id = 5;
-- alle Beiträge mit nutzer_id = 5 werden automatisch mitgelöschtOhne CASCADE würde SQLite das Löschen verweigern, solange noch Beiträge daran hängen (Schutz vor Datenmüll). Mit CASCADE räumt die Datenbank die abhängigen Zeilen selbst auf – kein manuelles DELETE in der richtigen Reihenfolge mehr.
Alternativen zu CASCADE
ON DELETE SET NULL: Verweis wird aufNULLgesetzt (Beitrag bleibt, Nutzer-Bezug weg).ON DELETE RESTRICT(Standard): Löschen wird blockiert, solange Abhängige existieren.
Wähle bewusst: CASCADE ist bequem, aber löscht eben auch – bei wichtigen Daten ist RESTRICT oft sicherer.
Wenn du ein Projekt mit sauber modellierter, konsistenter Datenbank brauchst, baue ich dir das Fundament dahinter – meld dich über bymw.de.
Quellen
Du brauchst mehr als ein Snippet?
Ich entwickle Android-Apps in Kotlin und moderne Websites für Selbstständige und kleine Unternehmen — von der ersten Idee bis zum Release.
Projekt anfragen →Verwandte Snippets
Werte einer Gruppe zu einer Liste zusammenfassen – GROUP_CONCAT in SQLite
Du willst pro Zeile nicht nur zählen, sondern die Werte selbst sehen – etwa alle Tags eines Beitrags als „PHP, SQL, Tipp" in einer Spalte? Genau dafür gibt es GROUP_CONCAT. Ich zeige dir die Grundform, ein eigenes Trennzeichen und wie du Dubletten sortiert loswirst.
Mit Datum und Zeit rechnen in SQLite – strftime und date()
SQLite hat keinen echten Datumstyp – Zeitangaben sind Text oder Zahlen. Mit den eingebauten Funktionen date(), datetime() und strftime() gruppierst du trotzdem nach Monat, rechnest Tage dazu und formatierst sauber. Ich zeige die Muster, die ich ständig brauche.
CASE WHEN in SQL – Bedingungen direkt in der Abfrage
Mit CASE WHEN baust du Wenn-Dann-Logik direkt in SQL: abgeleitete Spalten, Kategorien aus Zahlen und der Trick, mit dem du in einer Abfrage nach mehreren Kriterien gleichzeitig zählst (bedingte Aggregation).