Manchmal will man nicht alle Felder von Hand ausfüllen – entweder weil man faul ist oder weil die Daten einfach nicht da sind. In solchen Fällen kann man Standardwerte vorher festlegen, damit die Datenbank sie automatisch einsetzt, wenn nötig.
Einfügen von Zeilen in eine Tabelle
Standardwerte hängen eng mit dem Einfügen von Zeilen in eine Tabelle zusammen. Deshalb erzähle ich jetzt kurz darüber, und in ein paar Lektionen kommen wir nochmal ausführlicher darauf zurück.
Zeilen in eine Tabelle einzufügen ist super easy – dafür gibt’s das spezielle Kommando INSERT INTO. INSERT INTO ist ein SQL-Operator, der neue Zeilen in eine Tabelle einfügt. Das ist einer der meistgenutzten Befehle, vor allem wenn du mit Web-Formularen, Logs, User-Registrierung oder Daten-Updates arbeitest.
Syntax vom Befehl
INSERT INTO tabelle (spalte1, spalte2, ...)
VALUES (wert1, wert2, ...);
Erklärung:
tabelle– Name der Tabelle, in die die Daten eingefügt werden.spalte1,spalte2, ... – Aufzählung der Spalten (kannst du weglassen, wenn du für alle Spalten Werte in der richtigen Reihenfolge angibst).wert1,wert2, ... – Werte, die zu den genannten Spalten passen.
Einfaches Beispiel
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');
Fügt der Tabelle users eine Zeile hinzu: Name – "Alice", Email – "alice@example.com".
Ergebnis:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
Mehrere Zeilen auf einmal einfügen
Du kannst auch mehrere Einträge mit einem einzigen Query einfügen – das ist schneller und effizienter.
INSERT INTO users (name, email)
VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.net'),
('Charlie', 'charlie@example.org'),
('Diana', 'diana@example.com'),
('Eve', 'eve@example.net');
Und so sieht das Ergebnis aus:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
| 3 | Charlie | charlie@example.org |
| 4 | Diana | diana@example.com |
| 5 | Eve | eve@example.net |
Standardwert
Erinnerst du dich an die Syntax zum Einfügen von Zeilen?
INSERT INTO tabelle (spalte1, spalte2, ...)
VALUES (wert1, wert2, ...);
Warum gibt’s da eigentlich die Spaltenliste: spalte1, spalte2? Man könnte doch einfach die Werte in der gleichen Reihenfolge wie die Spalten angeben, oder?
Der Punkt ist: Viele Werte muss man gar nicht angeben beim Einfügen. Zum Beispiel berechnet PostgreSQL die ID einer neuen Zeile selbst. Auch das aktuelle Datum/Uhrzeit kann automatisch eingetragen werden. Wenn du keine Daten für eine Spalte angibst, setzt PostgreSQL sie auf NULL.
PostgreSQL kann dir da echt viel Arbeit abnehmen. Und du kannst das steuern – dafür gibt’s Standardwerte, die du mit dem Keyword DEFAULT festlegst.
Der Standardwert wird verwendet, wenn beim Einfügen für eine bestimmte Spalte kein Wert angegeben wird. Das spart nicht nur Zeit, sondern verhindert auch Fehler wie das Vergessen eines wichtigen Wertes.
Wie funktioniert DEFAULT?
Schauen wir uns die Syntax an. Standardwerte werden beim Erstellen der Tabelle festgelegt. Das ist das allgemeine Format:
CREATE TABLE tabelle (
spalte datentyp DEFAULT standardwert
);
Oder falls du einen Standardwert für eine bestehende Tabelle hinzufügen willst:
ALTER TABLE tabelle
ALTER COLUMN spalte
SET DEFAULT standardwert;
Mehr dazu, wie man Tabellen ändert, gibt’s in ein paar Lektionen :P
Beispiel 1: Tabelle mit DEFAULT-Feld
Wir erstellen eine Tabelle students, in der jeder Student automatisch ein Registrierungsdatum bekommt:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
registration_date DATE DEFAULT CURRENT_DATE
);
Wenn du jetzt einen neuen Studenten ohne registration_date einfügst, setzt PostgreSQL das Feld automatisch auf das aktuelle Datum.
INSERT INTO students (name) VALUES ('Alex Lin');
Bei der Abfrage:
SELECT * FROM students;
bekommst du folgendes Ergebnis:
| id | name | registration_date |
|---|---|---|
| 1 | Alex Lin | 2023-10-15 |
Praktische Beispiele
Standardwert für eine Zahlenspalte
Angenommen, wir haben eine Tabelle grades, in der die Spalte grade standardmäßig 0 sein soll, falls noch keine Note vergeben wurde.
CREATE TABLE grades (
id SERIAL PRIMARY KEY,
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
grade INTEGER DEFAULT 0
);
Wir fügen einen Eintrag ohne grade hinzu:
INSERT INTO grades (student_id, course_id) VALUES (1, 101);
Jetzt sieht die Tabelle so aus:
| id | student_id | course_id | grade |
|---|---|---|---|
| 1 | 1 | 101 | 0 |
Verwendung von TEXT mit Standardwert
Stell dir eine Tabelle teachers vor, in der jedem Lehrer beim Hinzufügen automatisch der Status „nicht bestätigt“ zugewiesen wird.
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
status TEXT DEFAULT 'unverified'
);
Wir fügen einen Lehrer ohne Status hinzu:
INSERT INTO teachers (name) VALUES ('Peter Pall');
Das Ergebnis sieht so aus:
| id | name | status |
|---|---|---|
| 1 | Peter Pall | unverified |
Standardwerte für Zeit
Für die Tabelle meetings, in der Meeting-Daten gespeichert werden, kann man das Feld meeting_time mit einer Standard-Startzeit von 10:00 Uhr anlegen.
CREATE TABLE meetings (
id SERIAL PRIMARY KEY,
topic VARCHAR(100),
meeting_time TIME DEFAULT '10:00'
);
Wir fügen einen Eintrag hinzu:
INSERT INTO meetings (topic) VALUES ('Projektbesprechung');
Ergebnis:
| id | topic | meeting_time |
|---|---|---|
| 1 | Projektbesprechung | 10:00 |
Typische Fehler bei der Verwendung von DEFAULT
Datentyp passt nicht zum Standardwert. Wenn du versuchst, einen Textwert für eine Zahlenspalte zu setzen, meckert PostgreSQL:
CREATE TABLE beispiel (
number INTEGER DEFAULT 'text'
);
Fehler:
invalid input syntax for type integer.
Ändern von DEFAULT ohne die bestehenden Einträge zu beachten. Wenn du den Standardwert änderst, betrifft das nicht die schon vorhandenen Zeilen – die bleiben wie sie sind. Wenn du bestehende Zeilen aktualisieren willst, nutze UPDATE.
UPDATE students SET registration_date = '2023-01-01' WHERE registration_date IS NULL;
Verwechslung von DEFAULT und NOT NULL. Ein Standardwert heißt nicht, dass das Feld automatisch Pflichtfeld ist (NOT NULL). Ohne NOT NULL kann die Spalte trotzdem NULL sein.
GO TO FULL VERSION