Die Datenbank: von CREATE bis DROP
Kurz gesagt: CREATE DATABASE legt auf einem Server eine neue Datenbank an, während DELETE, TRUNCATE, DROP TABLE und DROP DATABASE Zeilen, alle Zeilen, eine Tabelle oder die ganze Datenbank entfernen.
Problem
Das Lager will eine eigene Datenbank
Der Shop eröffnet ein Lager. Das Lager hat eigene Tabellen: Regale, Lieferungen, Bestandszählungen. Sie gehören nicht zur Website, und niemand will, dass ein Fehler im Lager die Bestellungen stoppt. Also bekommt das Lager eine eigene, getrennte Datenbank auf demselben Server.
Bisher hast du nur in der Datenbank des Shops gearbeitet. Jetzt siehst du das ganze Leben einer Datenbank: wie sie entsteht, wie du dich mit ihr verbindest, wie sie gefüllt und wie sie entfernt wird.
Die Idee
Ein Server, viele Datenbanken
Ein Datenbankserver (PostgreSQL, MySQL, SQL Server) enthält viele Datenbanken. Jede hat ihre eigenen Tabellen, ihre eigenen Benutzer und Berechtigungen. Eine neue Datenbank legt man mit CREATE DATABASE an:
-- PostgreSQLCREATE DATABASE warehouse;\c warehouse -- psql verbindet sich mit der neuen Datenbank
-- MySQLCREATE DATABASE warehouse;USE warehouse; -- die nächsten Abfragen laufen darinDiese Befehle funktionieren in den Feldern hier nicht, weil die Seite SQLite benutzt. SQLite hat keinen Server: Eine Datenbank ist eine Datei. Eine neue Datenbank ist eine neue Datei: sqlite3 warehouse.db im Terminal legt sie an, wenn es sie nicht gibt. Deshalb hat SQLite kein CREATE DATABASE.
Welche Datenbank benutzt das Feld gerade? main ist die Datenbank des Shops:
Die Idee
Eine neue Datenbank in SQLite: ATTACH
Innerhalb einer schon offenen Verbindung hängt SQLite mit ATTACH eine weitere Datenbank an. Auf einem Computer schreibst du einen Dateinamen (ATTACH 'warehouse.db' AS warehouse), und die Datei wird angelegt, wenn es sie nicht gibt. Im Browser nehmen wir ':memory:': eine neue leere Datenbank im Arbeitsspeicher, die mit dem Feld verschwindet. Der Name nach AS ist der Name der Datenbank, und ihre Tabellen schreibst du mit ihm davor:
Die Tabelle shelves liegt in der Datenbank warehouse, nicht im Shop. Wie genau die Spalten in CREATE TABLE geschrieben werden, steht in der nächsten Lektion. Hier zählt, wohin sie gehören.
Sieh es dir an
Eine Abfrage über zwei Datenbanken
In SQLite und MySQL kann eine Abfrage aus zwei Datenbanken gleichzeitig lesen. Die Regale sind im Lager, die Namen und der Bestand im Shop:
main.products ist die Tabelle des Shops. main. kann man weglassen: Bei einer Tabelle ohne Datenbanknamen sucht SQLite in der temporären Datenbank, dann in main und erst dann in den angehängten. In PostgreSQL geht das nicht: Eine Abfrage sieht nur die Datenbank, mit der sie verbunden ist. Dort werden getrennte Teile eines Systems in einer Datenbank in Schemas aufgeteilt (warehouse.shelves ist das Schema warehouse), und getrennte Datenbanken sind wirklich getrennt.
Probier es aus
Die Datenbank des Lagers
Lege die Datenbank warehouse an (im Arbeitsspeicher), darin eine Tabelle deliveries mit den Spalten id (Primärschlüssel), product_id und quantity (ganze Zahlen, Pflicht) und trage eine Lieferung ein: 40 Stück von Produkt 12.
Lösung
ATTACH ':memory:' AS warehouse;
CREATE TABLE warehouse.deliveries (
id INTEGER PRIMARY KEY,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL
);
INSERT INTO warehouse.deliveries (product_id, quantity) VALUES (12, 40);ATTACH ':memory:' AS warehouse, dann CREATE TABLE warehouse.deliveries (…) und INSERT INTO warehouse.deliveries …. Ohne warehouse. vor dem Namen landet die Tabelle in main, also in der Datenbank des Shops, und das Lager bleibt leer. Das ist der häufigste Fehler bei mehreren Datenbanken.
Die Idee
Vier Arten zu entfernen
Vom Kleinsten zum Größten:
DELETE FROM t WHERE …entfernt die gewählten Zeilen. OhneWHEREentfernt es alle, aber die Tabelle bleibt.TRUNCATE TABLE t(PostgreSQL, MySQL, SQL Server) entfernt alle Zeilen auf einmal, bei einer großen Tabelle viel schneller alsDELETE. In MySQL und SQL Server setzt es auch die Nummerierung vonidzurück, in PostgreSQL nur mitTRUNCATE TABLE t RESTART IDENTITY. SQLite hat keinTRUNCATE: Dort machtDELETE FROM tohneWHEREdasselbe auf eine schnelle Art.DROP TABLE tentfernt die Tabelle selbst: die Zeilen, die Spalten, ihre Indizes. Danach isttweg.DROP DATABASE warehouseentfernt die ganze Datenbank mit allen Tabellen. In SQLite heißt das, die Datei zu löschen.
Hier leert DELETE die Tabelle der Aktionen, und DROP TABLE entfernt sie. Die letzte Abfrage hat nichts mehr zu lesen:
Genauer, für Neugierige
DROP fragt nicht „bist du sicher?“ und kommt auch mit Strg+Z nicht zurück. In PostgreSQL funktioniert DROP DATABASE nicht, solange jemand mit der Datenbank verbunden ist, und in PostgreSQL und SQLite lässt sich ein DROP TABLE in einer Transaktion mit ROLLBACK zurücknehmen. In MySQL machen DROP und TRUNCATE von selbst ein COMMIT. Deshalb machst du vor einem DROP auf einer echten Datenbank zuerst eine Kopie (dafür ist die Lektion über die echte Website im Modul „Die Datenbank im Programm“ da).
Probier es aus
Eine Tabelle aus einem alten Import
Die Tabelle promo_import ist von einem Import von Aktionen übrig geblieben und wird nicht mehr gebraucht. Entferne sie samt den Daten, sodass das Skript nicht abbricht, wenn jemand sie schon entfernt hat.
Lösung
DROP TABLE IF EXISTS promo_import;DROP TABLE IF EXISTS promo_import. DELETE FROM promo_import lässt die leere Tabelle stehen, und ohne IF EXISTS bricht der zweite Versuch mit „no such table“ ab.
Übung
Leeren, aber behalten
Die Tabelle cart_log hält fest, was Kunden in den Warenkorb legen. Am Anfang jedes Monats wird sie geleert, bleibt aber für die neuen Einträge bestehen. Leere sie.
Lösung
DELETE FROM cart_log;DELETE FROM cart_log ohne WHERE (in PostgreSQL und MySQL wäre es TRUNCATE TABLE cart_log). DROP TABLE würde auch die Tabelle entfernen, und der nächste Eintrag von der Website bräche mit „no such table“ ab.
Die Idee
Abhängen
Wenn du sie nicht mehr brauchst, wird die Datenbank mit DETACH abgehängt. Die Datei bleibt auf der Platte, und ihre Tabellen sind von dieser Verbindung aus nicht mehr sichtbar:
Der ganze Weg einer Datenbank ist: anlegen (CREATE DATABASE, in SQLite eine neue Datei oder ATTACH), verbinden (\c, USE, ATTACH), Tabellen (CREATE TABLE, die nächste Lektion), Daten (INSERT, UPDATE, DELETE), Abfragen (SELECT) und zuletzt entfernen (DROP TABLE, DROP DATABASE). Das Projekt am Ende des Kurses geht den ganzen Weg mit dem Shop.
Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Primärschlüssel und Fremdschlüssel · JOIN: zwei Tabellen in einer Abfrage · INSERT: Zeilen einfügen · DELETE: Zeilen löschen
- Geht weiter in: Die Bäckerei, Etappe 1: Datenbank und Tabellen · Die Bäckerei, Etappe 6: der Bericht, die Kopie und DROP
- Aufgaben zum Thema: Tabellen und Regeln