Tabellen ändern und löschen
Tabellen ändern sich mit der Zeit: Der Shop beginnt, ein neues Datum zu erfassen, oder ein Name erweist sich als unklar. Du musst die Tabelle nicht mit allen Zeilen löschen und neu erstellen: ALTER TABLE ändert eine Tabelle, die schon da ist. ADD COLUMN fügt ihr eine Spalte hinzu:
ALTER TABLE kunden
ADD COLUMN telefon TEXT;
SELECT name, telefon
FROM kunden
LIMIT 2;| name | telefon |
|---|---|
| Emma Becker | NULL |
| Lukas Neumann | NULL |
Die neue Spalte wird am Ende der Tabelle hinzugefügt. Die Zeilen, die schon da sind, bekommen darin NULL oder den DEFAULT der Spalte. Deshalb braucht eine neue Spalte mit NOT NULL einen DEFAULT: Ohne ihn würden die vorhandenen Zeilen die Regel verletzen:
ALTER TABLE kunden
ADD COLUMN newsletter INTEGER NOT NULL;Error on line 1: Cannot add a NOT NULL column with default value NULLMit DEFAULT 0 funktioniert es, und jeder Kunde bekommt 0. RENAME COLUMN benennt eine Spalte um und RENAME TO die ganze Tabelle:
ALTER TABLE kunden
RENAME COLUMN beigetreten TO angemeldet_am;
ALTER TABLE positionen
RENAME TO bestellzeilen;SQLite ändert den Namen in der ganzen Datenbank, zum Beispiel in den Fremdschlüsseln anderer Tabellen. Aber die Abfragen im Code einer App verwenden weiter den alten Namen und würden nicht mehr funktionieren, deshalb werden Tabellen und Spalten in einer echten App selten und vorsichtig umbenannt. Außerdem kann das ALTER TABLE von SQLite nur noch eine Spalte löschen (DROP COLUMN). Es kann den Typ einer Spalte nicht ändern und einer vorhandenen Spalte weder NOT NULL noch UNIQUE oder CHECK hinzufügen. Dafür erstellst du eine neue Tabelle, wie sie sein soll, kopierst die Zeilen mit INSERT … SELECT hinein, löschst die alte Tabelle und gibst der neuen ihren Namen. Andere Datenbanken können mehr.
DROP TABLE bewertungen; löscht eine Tabelle mit allen ihren Zeilen. Es gibt kein „Bist du sicher?“ und kein Rückgängigmachen; nur innerhalb einer Transaktion kann ROLLBACK die Tabelle zurückbringen. Eine Tabelle, auf die andere Tabellen mit ihren Fremdschlüsseln zeigen, kann nicht gelöscht werden, solange Zeilen darauf zeigen, also müssen die Tabellen, die darauf zeigen, zuerst gehen:
DROP TABLE spiele;Error on line 1: FOREIGN KEY constraint failedDROP TABLE für eine Tabelle, die es nicht gibt, ist ein Fehler, ebenso CREATE TABLE für eine Tabelle, die es schon gibt. In Skripten, die mehr als einmal laufen können, schreiben Programmierer DROP TABLE IF EXISTS und CREATE TABLE IF NOT EXISTS: Wenn die Tabelle nicht da ist oder schon da ist, tut die Anweisung einfach nichts. Der Tab Tabellen zeigt die Tabellen weiterhin so, wie die Übung mit ihnen beginnt; deine Änderungen sehen nur die Anweisungen in deiner Datei.
Typischer Fehler: DROP TABLE und DELETE FROM zu verwechseln. DELETE FROM bewertungen; löscht alle Zeilen, aber die leere Tabelle bleibt, bereit für neue. DROP TABLE bewertungen; löscht die Tabelle selbst, mit ihren Spalten und Regeln.
So schreibst du es:
Anweisungen
- 1
Der Shop plant einen Sale. Füge der Tabelle
spieleeine Spalterabatthinzu: eine Ganzzahl, immer ausgefüllt, standardmäßig 0. Gib dann den Rennspielen einen Rabatt von 5 (mitUPDATE). Zeige zum Schluss den Titel, das Genre und den Rabatt der Renn- und Puzzlespiele, sortiert nach dem Titel:titel genre rabatt Cube Logic Puzzle 0 Pixel Racer Rennspiel 5 Turbo Karts Rennspiel 5 Word Quest Puzzle 0 - 2
Benenne darunter die Tabelle
bewertungeninspielbewertungenum und ihre Spaltesterneinwertung. Zeige dann, wie viele Bewertungen jede Wertung hat, in den Spaltenwertungundanzahl, von der höchsten Wertung an:wertung anzahl 5 8 4 10 3 5 2 2 - 3
Der Shop nimmt seine Bestellungen jetzt über einen Online-Zahlungsdienst entgegen, der sie in seiner eigenen Datenbank führt, also braucht diese Datenbank sie nicht mehr. Lösche am Ende der Datei die Tabellen
bestellungenundpositionen. Schreibe beide mitIF EXISTS(DROP TABLE IF EXISTS …), damit die Datei auch auf einer Datenbank laufen würde, in der sie schon weg sind. Eine der beiden Tabellen zeigt auf die andere: Überlege, welche von ihnen zuerst gehen muss.