Datenbanktabellen erstellen und ändern mit SQL

Lerne, eigene Datenbanktabellen zu erstellen und die darin enthaltenen Daten sicher zu ändern. Schreibe CREATE TABLE-Anweisungen mit sinnvollen Datentypen, schütze die Daten mit NOT NULL, UNIQUE, CHECK, Primärschlüsseln und Fremdschlüsseln und füge mit INSERT, UPDATE und DELETE Zeilen hinzu, ändere oder entferne sie. Übe, genau die richtigen Zeilen zu treffen, fasse zusammengehörige Änderungen zu Transaktionen zusammen, die du festschreiben oder zurücksetzen kannst, und ändere oder entferne Tabellen mit ALTER TABLE und DROP TABLE. Die Beispiele verwenden Standard-SQL, das auf SQLite und PostgreSQL läuft. Unterschiede in MySQL, SQL Server und Oracle werden genannt, wo sie eine Rolle spielen.

AnfängerEinheit 6 von 6 in Kurs: SQL – Datenbanken abfragen mit SELECT, JOIN und GROUP BY

Was du lernst

  1. Schreibe CREATE TABLE-Anweisungen, die eine Tabelle und ihre Spalten definieren, und wähle für jede Spalte einen Datentyp, der zu den gespeicherten Werten passt.
    • Eine CREATE-TABLE-Anweisung schreiben
      Definiere eine neue Tabelle mit benannten Spalten, prüfe ihre Struktur und vermeide die häufigsten Syntaxfehler von Anfängern.
    • Für jede Spalte einen Datentyp wählen
      Wähle Ganzzahl-, exakte Dezimal-, Gleitkomma-, Text-, Datums- und Wahrheitswerttypen passend zu den Werten einer Spalte und lerne, wie sich die flexible Typisierung von SQLite von strengeren Datenbanken unterscheidet.
  2. Verwende Integritätsbedingungen, damit die Datenbank selbst fehlende, doppelte, außerhalb des zulässigen Bereichs liegende und nicht zugeordnete Werte ablehnt, und gib jeder Zeile einen zuverlässigen Schlüssel.
    • Werte mit NOT NULL, DEFAULT, UNIQUE und CHECK vorschreiben, vorbelegen und einschränken
      Deklariere Spalten- und Tabellenregeln, die vorhandene, unterschiedliche und im zulässigen Bereich liegende Werte sicherstellen, und sage voraus, welche Einfügungen eine Regel ablehnt.
    • Zeilen mit Primärschlüsseln und generierten IDs identifizieren
      Deklariere Primärschlüssel aus einer oder mehreren Spalten, lass die Datenbank neue Zeilen nummerieren und lerne, was generierte IDs im jeweiligen Datenbanksystem gewährleisten und was nicht.
    • Tabellen über Fremdschlüssel verknüpfen
      Deklariere Fremdschlüssel, die gültige Verweise zwischen Tabellen sicherstellen, wähle das Verhalten beim Löschen einer referenzierten Zeile und schalte die Fremdschlüsselprüfung ein, wo sie ausgeschaltet ist.
  3. Füge neue Zeilen mit INSERT einzeln, mehrere auf einmal oder als Kopie aus einer Abfrage hinzu und behandle generierte Schlüssel und Duplikate.
    • Zeilen mit VALUES einfügen
      Schreibe INSERT ... VALUES-Anweisungen mit einer Spaltenliste und korrekt geschriebenen Texten, Zahlen, Datumswerten und NULL, und lies die Fehler, die eine Einfügung verhindern.
    • Abfrageergebnisse einfügen, neue Schlüssel zurückgeben und Duplikate behandeln
      Kopiere Zeilen mit INSERT ... SELECT, lies generierte Werte mit RETURNING aus und entscheide, was geschieht, wenn eine eingefügte Zeile mit einer vorhandenen kollidiert.
  4. Ändere Werte mit UPDATE und entferne Zeilen mit DELETE. Stelle dabei sicher, dass jede Anweisung genau die vorgesehenen Zeilen betrifft.
    • Werte mit UPDATE ändern
      Schreibe UPDATE-Anweisungen, die eine oder mehrere Spalten setzen, neue Werte aus alten berechnen und die Integritätsbedingungen der Tabelle einhalten.
    • Zeilen mit DELETE löschen
      Entferne ausgewählte Zeilen mit DELETE, unterscheide DELETE, TRUNCATE und DROP TABLE und entscheide, wann es besser ist, eine Zeile als gelöscht zu markieren, statt sie zu entfernen.
    • Genau die gemeinten Zeilen treffen
      Erstelle WHERE-Bedingungen für Änderungen, die nur die vorgesehenen Zeilen treffen, und prüfe das Ergebnis, bevor du es übernimmst.
  5. Verwende Transaktionen, damit zusammengehörige Änderungen als Ganzes übernommen oder rückgängig gemacht werden, und behebe Fehler beim Ausführen einer Anweisung geordnet.
    • Zusammengehörige Änderungen festschreiben oder zurücksetzen
      Starte eine Transaktion, übernimm ihre Änderungen mit COMMIT oder mache sie mit ROLLBACK rückgängig und lerne, wie Autocommit funktioniert.
    • Fehler, Sicherungspunkte und Strukturänderungen in einer Transaktion handhaben
      Reagiere richtig, wenn eine Anweisung innerhalb einer Transaktion fehlschlägt, mache einen Teil der Transaktion mit einem Sicherungspunkt rückgängig und lerne, welche Datenbanken CREATE, ALTER und DROP zurücksetzen können.
  6. Ändere die Struktur bestehender Tabellen, ohne ihre Zeilen zu verlieren, und entferne Tabellen sicher, wenn sie nicht mehr gebraucht werden.
    • Spalten mit ALTER TABLE hinzufügen, umbenennen und entfernen
      Verwende ALTER TABLE, um Spalten hinzuzufügen, umzubenennen und zu entfernen sowie Typen und Integritätsbedingungen zu ändern, und umgehe die Beschränkungen von SQLite.
    • Tabellen mit DROP TABLE entfernen
      Entferne Tabellen mit DROP TABLE, beachte die Abhängigkeiten zwischen Tabellen und wähle zwischen dem Entfernen einer Tabelle, dem Leeren und dem Löschen von Zeilen.

Datenbanktabellen erstellen und ändern einfach erklärt

6 Kapitel

1

Tabellen mit passenden Spaltentypen anlegen

Eine Tabelle braucht eine klare Struktur, bevor sie nützliche Daten aufnehmen kann. Beginne mit den Angaben, die eine Zeile festhält, gib jeder Angabe einen Namen und wähle, wie die Datenbank sie speichert. Du erstellst eine leere Tabelle, prüfst, was tatsächlich erstellt wurde, und unterscheidest eine Zahl zum Rechnen von Text, der nur wie eine Zahl aussieht. SQLite und PostgreSQL haben viel gemeinsame Syntax, doch ihre Typregeln können zu sehr unterschiedlichen Ergebnissen führen.

1.1 Eine CREATE-TABLE-Anweisung schreiben

Eine Tabellendefinition beschreibt, was jede Zeile enthalten kann. Sie fügt keine Zeilen hinzu. In einem Onlineshop benötigt jedes Produkt eigene Felder für Kennung, Name, Preis und Lagerbestand.

Die Definition erstellen
CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  price NUMERIC(8, 2) NOT NULL,
  in_stock INTEGER DEFAULT 0
);

Lies von außen nach innen. CREATE TABLE products benennt die neue Tabelle. Die Klammern enthalten ihre Spaltendefinitionen. Jede Zeile gibt einen Spaltennamen, einen Typ und mögliche Regeln für diese Spalte an. Kommas trennen die Definitionen; nach der letzten Definition steht kein Komma. Das Semikolon beendet die Anweisung. Nach ihrer erfolgreichen Ausführung gibt SELECT * FROM products; keine Zeilen zurück.

Diese Schlüsseldeklaration generiert IDs in SQLite. In PostgreSQL verwendest du dafür id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY. Auch die Dezimaltypdeklaration verhält sich in diesen Systemen unterschiedlich; eine exakte Speicherung zu wählen gehört zur Typwahl.

Jede Angabe erhält eine eigene Spalte

Eine Kundenzeile könnte id, first_name, last_name, email und signup_date enthalten. Wenn „Ana Ruiz, ana@example.com“ in einem Feld steht, lassen sich Name und E-Mail-Adresse nur schwer getrennt durchsuchen oder prüfen. Benenne die Felder nach ihrem Inhalt. Kurze Namen in Kleinbuchstaben, die durch Unterstriche verbunden sind, etwa unit_price, lassen sich leicht wiederverwenden.

Vermeide Schlüsselwörter als Namen: orders funktioniert, während order ohne Anführungszeichen mit dem SQL-Schlüsselwort ORDER kollidiert. Ein Name mit Leerzeichen braucht bei jeder Verwendung doppelte Anführungszeichen, wie in "order date". PostgreSQL wandelt Namen ohne Anführungszeichen in Kleinbuchstaben um, sodass Products und products ohne Anführungszeichen denselben Namen bezeichnen.

Einfache Anführungszeichen haben eine andere Aufgabe: Sie schließen Textwerte wie 'Desk lamp' ein. Doppelte Anführungszeichen kennzeichnen Namen. PostgreSQL liest "Desk lamp" als Spaltennamen, nicht als Produkttext.

Das Ergebnis prüfen

Ein abschließendes Komma vor ) verursacht einen Syntaxfehler. Ein fehlendes Komma tut das häufig ebenfalls, aber SQLite kann mehrere Wörter als einen Typnamen lesen. CREATE TABLE t (a INTEGER b TEXT); erstellt eine Spalte namens a, nicht zwei Spalten. Prüfe die Definition:

  • SQLite-Shell: .schema products gibt die Erstellungsanweisung aus.
  • SQLite-SQL: PRAGMA table_info(products); listet Spalten und Typen auf.
  • PostgreSQL-psql: \d products zeigt Spalten, Typen und Integritätsbedingungen.

CREATE TABLE IF NOT EXISTS products (...) vermeidet einen Fehler, wenn der Name bereits vorhanden ist. Die Anweisung vergleicht oder aktualisiert die alte Definition nicht. Fehlt der Tabelle eine benötigte Spalte, bleibt das so.

Eine einmalige Kopie erstellen
CREATE TABLE cheap_products AS
SELECT name, price FROM products WHERE price < 10;

Dies erstellt Spalten und kopiert die Zeilen der Abfrage. Spätere Produktänderungen aktualisieren die Kopie nicht. In SQLite und PostgreSQL übernimmt die neue Tabelle weder den Primärschlüssel noch die NOT NULL- oder CHECK-Regeln der Quelle.

CREATE, ALTER und DROP gehören zur Datendefinitionssprache, kurz DDL: Sie ändern die Struktur. INSERT, UPDATE und DELETE gehören zur Datenmanipulationssprache, kurz DML: Sie ändern Zeilen. SELECT liest Daten; Bücher unterscheiden sich darin, ob sie es zu DML zählen oder Abfragen eine eigene Gruppe geben.

Wichtige Erkenntnisse

  • Spaltendefinitionen enthalten einen Namen, einen Typ und optionale Regeln.
  • Verwende Kommas zwischen den Definitionen, aber kein abschließendes Komma.
  • Einfache Anführungszeichen schließen Text ein; doppelte Anführungszeichen schließen Bezeichner ein.
  • Prüfe die entstandene Struktur auch nach einer IF-NOT-EXISTS-Anweisung.
  • CREATE TABLE AS kopiert Abfragedaten, ohne die Integritätsbedingungen der Quelle zu kopieren.

1.2 Für jede Spalte einen Datentyp wählen

Wähle den Typ nach der Aufgabe des Werts. Mit einer Menge muss man rechnen können. Eine Postleitzahl muss ihre Zeichen einschließlich führender Nullen behalten. Beide können Ziffern enthalten, brauchen aber unterschiedliche Speicherformen.

Zahlen- und Texttypen wählen
WerteGeeigneter TypGrund
Ganzzahlige AnzahlenINTEGERAnzahlen haben keinen Nachkommateil.
Exakte Geldbeträge in PostgreSQLNUMERIC(p, s)Dezimalrechnung erhält exakte Beträge.
Exakte Geldbeträge in SQLiteCent als INTEGERGanze Centbeträge vermeiden die Speicherung als Gleitkommazahl.
MesswerteREAL oder DOUBLE PRECISIONNäherungswerte eignen sich für Messgrößen.
Namen und CodesTEXT oder VARCHAR(n)Zeichen und führende Nullen bleiben erhalten.

In PostgreSQL hat NUMERIC(8, 2) insgesamt acht Ziffern, zwei davon nach dem Komma. Der größte positive Wert ist 999.999,99. Beim Einfügen von 12,345 wird 12,35 gespeichert; 1.234.567,00 führt zu einem Überlauf, weil der Wert sieben Ziffern vor dem Komma benötigt. DECIMAL ist ein anderer Name für diese Typfamilie.

SQLite akzeptiert NUMERIC(8, 2), setzt aber weder die Genauigkeit noch die Dezimalstellenanzahl durch. Es speichert 19,99 als Gleitkommazahl und behält 12,345 ungerundet bei. Speichere für einen exakten Betrag von 19,99 insgesamt 1.999 ganze Cent. Gleitkommazahlen nähern binäre Brüche an: SELECT 0.1 + 0.2 = 0.3; liefert in SQLite 0. PostgreSQL behandelt diese Dezimalliterale ohne weitere Typangabe als exakte numerische Werte; wandle sie in DOUBLE PRECISION um, um das Näherungsergebnis zu sehen.

Zahlen als Text werden nach Zeichen sortiert: '100', '25', '9' erscheinen in dieser Reihenfolge. Numerische Mengen brauchen Zahlenspalten. Die US-Postleitzahl '02139' gehört in eine Textspalte; bei ganzzahliger Speicherung geht ihre führende Null verloren.

PostgreSQL lehnt bei VARCHAR(20) Text mit mehr als 20 Zeichen ab. Sein CHAR(n) füllt kürzeren Text mit Leerzeichen auf eine feste Länge auf. Für TEXT ist keine Zeichenbegrenzung deklariert. SQLite behandelt sowohl VARCHAR(n) als auch CHAR(n) als Text, ohne die Länge durchzusetzen oder aufzufüllen.

Datums- und Ja-Nein-Werte speichern

PostgreSQL hat DATE, TIME, TIMESTAMP und BOOLEAN. Es lehnt ein unmögliches DATE wie '2026-02-30' ab. SQLite hat keinen eigenen Speichertyp für Datumswerte. Verwende ISO-Text wie '2026-03-15', dessen Zeichenreihenfolge der Datumsreihenfolge entspricht. Text im US-Format sortiert Datumswerte über Jahresgrenzen hinweg falsch: '12/01/2025' steht nach '03/15/2026'.

Ein Zeitstempel ergänzt eine Uhrzeit, etwa '2026-03-15 14:30:00'. PostgreSQL verwendet TRUE und FALSE für boolesche Werte; SQLite speichert 1 und 0 und akzeptiert diese Schlüsselwörter. MySQL behandelt BOOLEAN als kleine Ganzzahl; SQL Server verwendet BIT.

Wissen, was das System durchsetzt

Gewöhnliche SQLite-Tabellen verwenden Typaffinität, eine Präferenz für die Speicherung. Eine INTEGER-Spalte wandelt '5' in 5 um, akzeptiert aber 'abc' als Text. PostgreSQL lehnt Text ab, der nicht in eine Ganzzahl umgewandelt werden kann. SQLite ab 3.37.0 unterstützt STRICT-Tabellen mit den erlaubten Typen INT, INTEGER, REAL, TEXT, BLOB und ANY.

Wähle für Bestellungen eine ganzzahlige id, Text für die E-Mail-Adresse, ein PostgreSQL-DATE oder einen SQLite-Datumswert als ISO-Text, PostgreSQL-NUMERIC(10, 2) oder ganzzahlige Centbeträge in SQLite für den Gesamtbetrag und ein boolesches oder ein 0/1-Flag für die Zahlung. NULL bedeutet fehlend oder unbekannt; es ist weder ein Typ noch dasselbe wie null oder eine leere Zeichenkette. Eine Spalte akzeptiert es, sofern eine Regel es nicht verbietet.

Wichtige Erkenntnisse

  • Wähle Typen nach der Verwendung: Rechnen, Text, Zeit oder Ja-Nein-Werte.
  • Die Genauigkeit bei NUMERIC zählt alle Ziffern; die Dezimalstellenanzahl zählt die Stellen nach dem Komma.
  • Verwende für exakte Geldbeträge PostgreSQL-NUMERIC oder ganzzahlige Centbeträge in SQLite.
  • Einheitlich geschriebener ISO-Datumstext wird nach Datum sortiert.
  • Die Typaffinität von SQLite erlaubt gemischte Speicherung; STRICT verschärft die Typprüfungen.
  • NULL kennzeichnet einen fehlenden oder unbekannten Wert.
2

Daten mit Integritätsbedingungen schützen

Eine Datenbank kann Regeln prüfen, sobald sich Daten ändern, unabhängig davon, welches Programm die Änderung sendet. Spaltenregeln kontrollieren fehlende Werte, Duplikate und Wertebereiche; Schlüssel identifizieren Zeilen und halten Verknüpfungen zwischen Tabellen gültig. Du verfolgst akzeptierte und abgelehnte Einfügungen, wählst generierte IDs und sagst voraus, was mit Bestellungen geschieht, wenn ein Kunde entfernt wird. Diese Regeln wirken zusammen: Eine Preisprüfung erfüllt eine andere Aufgabe als die Forderung, dass ein Preis vorhanden sein muss.

2.1 Werte mit NOT NULL, DEFAULT, UNIQUE und CHECK vorschreiben, vorbelegen und einschränken

Eine Integritätsbedingung sorgt dafür, dass die Datenbank Daten ablehnt, die gegen eine deklarierte Regel verstoßen. Die Prüfung erfolgt beim Einfügen oder Aktualisieren von Zeilen, unabhängig davon, welche Anwendung die Anweisung sendet. Verschiedene Regeln schützen verschiedene Teile eines Produktdatensatzes.

Regeln in einer Tabelle kombinieren

Diese SQLite-Definition generiert den Schlüssel und prüft die anderen Felder. Für PostgreSQL ersetzt du die Schlüsselzeile durch einen Primärschlüssel als Identitätsspalte.

CREATE TABLE products (
  id INTEGER PRIMARY KEY,
  sku TEXT NOT NULL UNIQUE,
  name TEXT NOT NULL,
  price NUMERIC(8, 2) NOT NULL CHECK (price > 0),
  in_stock INTEGER NOT NULL DEFAULT 0 CHECK (in_stock >= 0)
);

NOT NULL schreibt einen Wert vor. UNIQUE verhindert eine wiederholte Artikelnummer. CHECK (price > 0) lehnt Preise ab, die null oder negativ sind. Der Lagerbestand hat den Standardwert 0 und darf nicht negativ sein. Die numerische Deklaration in SQLite ermöglicht keine exakte Dezimalrechnung. Verwende daher ganze Centbeträge, wenn es auf Exaktheit ankommt.

Auslassen und NULL unterscheiden

Füge eine Schreibtischlampe mit der Artikelnummer 'LAMP-01', dem Namen 'Desk lamp' und dem Preis 24,99 ein und lass den Lagerbestand in der Spaltenliste aus. Die Einfügung gelingt und erhält den Lagerbestand 0. Ein angegebenes NULL für den Lagerbestand fordert den Standardwert nicht an: Es verstößt gegen NOT NULL.

Ein Kaffeebecher zum Preis von −3,50 verstößt gegen die Preisprüfung. Ein zweites Produkt mit der Artikelnummer 'LAMP-01' verstößt gegen UNIQUE, auch wenn sich Name und Preis unterscheiden. Ein Stift ohne Namen verstößt gegen NOT NULL. Lies im Fehler, welche Regel oder Spalte genannt wird, und korrigiere die Eingabe.

Eine leere Zeichenkette ist ein echter Wert. name TEXT NOT NULL akzeptiert '' in SQLite und PostgreSQL. Ergänze CHECK (name <> ''), um sie abzulehnen. Oracle behandelt leeren Text als NULL, sodass dort für dieselbe Eingabe eine andere Regel gilt.

Kombinationen und fehlende Werte prüfen

Eine Spaltenregel folgt auf den Typ der Spalte. Eine Tabellenregel ist ein eigener Eintrag innerhalb der Tabellendefinition und kann Spalten vergleichen:

CHECK (end_date >= start_date),
UNIQUE (order_id, product_id)

Die erste Regel lehnt ein Enddatum vor einem Startdatum ab. Die zweite lehnt ein wiederholtes Paar ab: Ein Produkt kann in verschiedenen Bestellungen vorkommen, aber nicht zweimal in derselben Bestellung. Eine Tabelle kann mehrere Eindeutigkeitsbedingungen haben.

Eine Prüfung lehnt eine Zeile ab, wenn ihre Bedingung falsch ist. Ist der Preis NULL, ist price > 0 unbekannt, sodass die Prüfung bestanden wird. Deshalb braucht der Produktpreis auch NOT NULL. PostgreSQL, SQLite und MySQL erlauben unter UNIQUE normalerweise mehrere NULL-Werte; SQL Server erlaubt bei einer Eindeutigkeitsbedingung für eine einzelne Spalte einen. PostgreSQL ab Version 15 bietet UNIQUE NULLS NOT DISTINCT, wenn auch fehlende Werte miteinander kollidieren sollen. MySQL-Versionen vor 8.0.16 ignorierten CHECK-Regeln.

Gib einer Regel mit CONSTRAINT price_positive CHECK (price > 0) einen sinnvollen Namen. Der Name hilft, sie in einem Fehler zu erkennen und später zu entfernen. Eine Integritätsbedingung prüft genau ihren Ausdruck: CHECK (email LIKE '%@%') erkennt ein fehlendes At-Zeichen, aber keinen Tippfehler in einer ansonsten passenden Adresse.

Wichtige Erkenntnisse

  • NOT NULL lehnt fehlende Werte ab, aber keine leere Zeichenkette in SQLite oder PostgreSQL.
  • DEFAULT füllt ausgelassene Spalten; ein ausdrückliches NULL fordert den Standardwert nicht an.
  • UNIQUE kann eine Spalte oder eine Kombination von Spalten schützen.
  • CHECK lehnt falsche Bedingungen ab; ergänze NOT NULL, wenn auch unbekannte Ergebnisse abgelehnt werden müssen.
  • Fehler bei Integritätsbedingungen zeigen Daten an, die korrigiert werden müssen.

2.2 Zeilen mit Primärschlüsseln und generierten IDs identifizieren

Ein Primärschlüssel identifiziert eine Zeile zuverlässig. Er kann aus einer Spalte oder einer Kombination bestehen, eine Tabelle hat aber höchstens einen Primärschlüssel. Der Schlüssel muss eindeutig und vorhanden sein, damit andere Anweisungen eine Zeile unabhängig von ihrer Beschreibung benennen können.

Eine stabile Kennung wählen

Ein natürlicher Schlüssel ist eine vorhandene Kennung aus der realen Welt, etwa die ISBN eines Buches. Ein Surrogatschlüssel ist eine künstliche Kennung, oft eine generierte Ganzzahl. Die E-Mail-Adresse eines Kunden kann sich ändern; eine generierte Kunden-ID kann dabei gleich bleiben.

Ein zusammengesetzter Schlüssel identifiziert eine Kombination:

PRIMARY KEY (order_id, product_id)

Eine Bestellung kann mehrere Produkte enthalten, und ein Produkt kann in mehreren Bestellungen vorkommen. Das Paar identifiziert eine Bestellposition. Keine der beiden Spalten muss für sich genommen eindeutig sein.

PostgreSQL, MySQL und SQL Server setzen voraus, dass Primärschlüssel nicht fehlen. Gewöhnliche SQLite-Tabellen behalten eine historische Ausnahme bei: Ein anderer Primärschlüssel als INTEGER PRIMARY KEY kann NULL enthalten. Verwende code TEXT PRIMARY KEY NOT NULL für einen Textschlüssel. SQLite-STRICT-Tabellen schließen diese Lücke ebenfalls.

Die Datenbank die Nummer generieren lassen
DatenbankDeklaration für einen generierten Primärschlüssel
SQLiteid INTEGER PRIMARY KEY
PostgreSQLid INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
MySQLid INT AUTO_INCREMENT PRIMARY KEY
SQL Serverid INT IDENTITY(1, 1) PRIMARY KEY

Lass id in der Spaltenliste der Einfügung aus, um einen generierten Wert anzufordern. Ein einfaches PostgreSQL-INTEGER PRIMARY KEY generiert keinen Wert. Älterer PostgreSQL-Code verwendet häufig SERIAL.

In SQLite ist INTEGER PRIMARY KEY ein Alias für die interne Zeilennummer. Beginne mit den generierten IDs 1, 2 und 3 und lösche dann 3. Die nächste regulär generierte ID ist wieder 3, also eins über dem aktuellen Maximum. Mit INTEGER PRIMARY KEY AUTOINCREMENT ist sie 4: Eine Nummer, die eine festgeschriebene Zeile hatte, wird nicht erneut verwendet. Eine Nummer aus einer zurückgesetzten Einfügung kann dennoch erneut verwendet werden. Diese stärkere Garantie verursacht zusätzlichen Aufwand, wähle sie daher, wenn es darauf ankommt, eine Wiederverwendung auszuschließen.

IDs lesen, ohne sie als Anzahlen zu behandeln

Lücken sind normal. Löschungen hinterlassen sie, und PostgreSQL gibt Sequenznummern nach fehlgeschlagenen oder zurückgesetzten Einfügungen nicht zurück. Verwende COUNT(*) für eine Zeilenanzahl und einen Zeitstempel für den Zeitpunkt eines Ereignisses. Die größte ID beantwortet keine der beiden Fragen zuverlässig.

Die PostgreSQL-Form GENERATED ALWAYS lehnt eine ausdrücklich angegebene ID wie 50 normalerweise ab. GENERATED BY DEFAULT und SERIAL akzeptieren ausdrückliche Werte, aber die Angabe von 50 setzt den Generator nicht hinter 50. Ein später generierter Wert kann damit kollidieren.

Um den Schlüssel einer neuen Zeile in einer zugehörigen Zeile zu verwenden, lies ihn aus:

INSERT INTO customers (first_name, last_name, email)
VALUES ('Dev', 'Patel', 'dev@example.com')
RETURNING id;

RETURNING funktioniert in PostgreSQL und ab SQLite 3.35.0. SQLite bietet außerdem last_insert_rowid(), MySQL bietet LAST_INSERT_ID(), und SQL Server verwendet OUTPUT. Lies das Ergebnis der Einfügung, statt die nächste ID zu erraten.

Wichtige Erkenntnisse

  • Ein Primärschlüssel identifiziert eine Zeile; ein zusammengesetzter Schlüssel identifiziert eine Kombination.
  • Generierte Schlüssel werden in verschiedenen Datenbanken unterschiedlich deklariert.
  • SQLite AUTOINCREMENT verhindert mit zusätzlichem Aufwand die Wiederverwendung festgeschriebener IDs.
  • Lücken in IDs sind normal; verwende COUNT(*), um Zeilen zu zählen.
  • RETURNING liest den tatsächlich generierten Schlüssel aus.

2.3 Tabellen über Fremdschlüssel verknüpfen

Die customer_id einer Bestellung sollte auf einen vorhandenen Kunden verweisen. Ein Fremdschlüssel veranlasst die Datenbank, diese Verknüpfung zu prüfen. Die Tabelle mit dem Verweis ist die Kindtabelle; die Tabelle, auf die sie verweist, ist die Elterntabelle.

Die Verknüpfung deklarieren und durchsetzen
CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer_id INTEGER NOT NULL REFERENCES customers(id)
);

Hier muss customers zuerst existieren, und seine id muss ein Primärschlüssel oder eindeutiger Schlüssel sein. Stimme die Typen auf beiden Seiten aufeinander ab. Die Tabellenform FOREIGN KEY (customer_id) REFERENCES customers(id) deklariert dieselbe Verknüpfung getrennt von der Spalte.

Bei eingeschalteter Fremdschlüsselprüfung schlägt eine Bestellung für Kunde 99 fehl, wenn kein Kunde 99 existiert. Auch das Aktualisieren einer Bestellung auf diesen fehlenden Kunden schlägt fehl. Ein Fremdschlüssel, der NULL zulässt, kann NULL enthalten, was bedeutet, dass keine Zeile verknüpft ist; NOT NULL schreibt die Verknüpfung vor.

Führe in SQLite bei jeder neuen Verbindung PRAGMA foreign_keys = ON; aus, bevor du eine Transaktion startest. Eine Änderung der Einstellung innerhalb einer Transaktion hat keine Wirkung. PostgreSQL und SQL Server setzen Fremdschlüssel normalerweise durch, ebenso die Standard-Engine InnoDB von MySQL.

Das Löschen einer Elternzeile vorhersagen

Nimm die Kunden 1, Ana, und 2, Ben. Die Bestellungen 101 und 102 gehören Ana; 103 gehört Ben. Betrachte, was beim Löschen von Kunde 1 unter verschiedenen Deklarationen geschieht:

ON-DELETE-AktionErgebnis
NO ACTION oder RESTRICTDas Löschen schlägt fehl, solange 101 und 102 auf Ana verweisen.
CASCADEAna, 101 und 102 werden entfernt; Ben und 103 bleiben bestehen.
SET NULLAna wird entfernt; alle Bestellungen bleiben bestehen, 101 und 102 ohne Verknüpfung.
SET DEFAULTDie verweisenden Werte erhalten ihren deklarierten Standardwert.

SET NULL benötigt eine Spalte, die NULL zulässt. SET DEFAULT muss weiterhin den Fremdschlüssel erfüllen: Ein nicht fehlender Standardwert muss eine vorhandene Elternzeile identifizieren. Ein NULL-Standardwert funktioniert, wenn fehlende Verknüpfungen erlaubt sind.

Wähle nach der Bedeutung der Daten. Bestellpositionen gehören oft vollständig zu ihrer Bestellung, sodass eine Kaskadierung passen kann. Bei Bestellungen, die erhalten bleiben müssen, ist eine blockierende Aktion passend, wenn jemand ihren Kunden entfernen möchte. Eine optionale Lieferantenverknüpfung kann auf NULL gesetzt werden. Werden Kaskadierungen überall eingesetzt, kann eine Löschung mehr Datensätze entfernen, als der Name ihrer Tabelle vermuten lässt.

In der Reihenfolge der Abhängigkeiten arbeiten

Erstelle Elterntabellen vor Kindtabellen und füge Elternzeilen vor den Zeilen ein, die auf sie verweisen. Arbeite beim Entfernen zusammengehöriger Daten oder Tabellen von den Kindtabellen zu den Elterntabellen. Eine ON UPDATE-Aktion bietet dieselben Möglichkeiten, wenn sich der Schlüssel der Elternzeile ändert; ON UPDATE CASCADE kopiert den neuen Schlüssel in die Kindzeilen.

RESTRICT prüft sofort. NO ACTION, die Standardeinstellung, kann bis zum Ende der Anweisung oder bei einer aufschiebbaren Integritätsbedingung bis zum Ende der Transaktion warten. Beide blockieren eine gewöhnliche Löschung, die Verweise ohne passende Elternzeile hinterlassen würde. Halte generierte IDs stabil, damit eine Änderung der Kundendaten nicht erfordert, jeden Verweis auf diesen Kunden zu ändern.

Wichtige Erkenntnisse

  • Ein Fremdschlüssel verknüpft Werte der Kindtabelle mit einem vorhandenen Primärschlüssel oder eindeutigen Schlüssel der Elterntabelle.
  • NULL erlaubt eine optionale Verknüpfung, sofern NOT NULL es nicht verbietet.
  • CASCADE löscht Kindzeilen; SET NULL erhält sie ohne ihre Verknüpfung.
  • Schalte bei jeder SQLite-Verbindung die Fremdschlüsselprüfung vor BEGIN ein.
  • Erstelle Elterntabellen und füge Elternzeilen zuerst ein; lösche Kindzeilen und entferne Kindtabellen zuerst.
  • Wähle Aktionen danach, welche Datensätze erhalten bleiben müssen.
3

Zeilen mit INSERT einfügen

Beim Hinzufügen von Zeilen ordnest du jeden Wert der richtigen Spalte zu und lässt die Datenbank das Ergebnis prüfen. Ein Produkt kann direkt eingegeben, mehrere Kunden können zusammen hinzugefügt und ältere Bestellungen aus einer Abfrage kopiert werden. Du liest außerdem einen generierten Schlüssel aus und entscheidest, wie mit einer vorhandenen Artikelnummer umzugehen ist. Dieselbe Eingabe kann einen ersetzenden Lagerbestand oder eine zusätzliche Lieferung bedeuten, daher muss ein Upsert die beabsichtigte Änderung genau ausdrücken.

3.1 Zeilen mit VALUES einfügen

INSERT fügt einer bestehenden Tabelle Zeilen hinzu. Die Spaltenliste ordnet die angegebenen Werte den Feldern zu, die sie aufnehmen. Schreibe diese Zuordnung ausdrücklich, damit eine spätere Tabellenänderung die Bedeutung deiner Eingabe nicht unbemerkt ändert.

Werte anhand ihrer Position zuordnen
INSERT INTO products (sku, name, price, in_stock)
VALUES ('LAMP-01', 'Desk lamp', 24.99, 12);

Lies die Paare der Reihe nach: Die Artikelnummer erhält 'LAMP-01', der Name erhält 'Desk lamp', der Preis erhält 24,99 und der Lagerbestand 12. Für diese vier Spalten muss es vier Werte geben. Eine Abweichung wie zwei Werte für drei Spalten führt zu einem Fehler.

Ohne die Liste folgen die Werte der deklarierten Spaltenreihenfolge der Tabelle. SQLite verlangt eine Angabe für alle Spalten; PostgreSQL erlaubt weniger und gibt den hinteren Spalten ihre Standardwerte. Mit einer ausdrücklichen Liste musst du dich auf keines dieser beiden Verhaltensweisen verlassen. Außerdem kannst du die Spalten in eine für die Eingabe klare Reihenfolge bringen.

Ein vertauschtes Paar kann schlimmer sein als ein Syntaxfehler. Gibst du 9,99 als Namen und 'Desk lamp' als Preis an, lehnt PostgreSQL den nicht numerischen Preis ab. Die gewöhnliche Typaffinität von SQLite kann den Namenstext „9.99“ und den Preistext „Desk lamp“ ohne Fehler speichern. Lies die eingefügte Zeile mit SELECT aus, um die Zuordnung zu prüfen.

Literale richtig schreiben
ArtSQL-Beispiel
Text'Desk lamp'
Text mit einem Apostroph'O''Brien'
Zahl1250.50
ISO-Datum'2026-03-15'
Fehlender WertNULL

Der doppelte Apostroph speichert einen Apostroph. Zahlen haben kein Währungszeichen und kein Tausendertrennzeichen; ein Komma trennt Werte, daher ändert ein Komma innerhalb eines Betrags ohne Anführungszeichen die Anzahl der Werte. 'NULL' ist der vierbuchstabige Text „NULL“, kein fehlender Wert.

Ausgelassene Felder automatisch füllen lassen

Eine ausgelassene Spalte erhält ihren Standardwert oder NULL, wenn sie keinen hat. Ein generierter Schlüssel erhält einen generierten Wert. Dieses letzte Verhalten hängt von der Deklaration ab: INTEGER PRIMARY KEY von SQLite generiert IDs; PostgreSQL benötigt dafür eine Identitätsdeklaration. Wird ein einfacher ganzzahliger Primärschlüssel in PostgreSQL bei einer Einfügung ausgelassen, schlägt sie fehl, weil sein Wert NULL wäre.

PostgreSQL, MySQL und SQL Server erlauben DEFAULT als Platzhalter für einen Wert. SQLite akzeptiert es nicht innerhalb einer VALUES-Liste; lass diese Spalte stattdessen aus. Ein ausdrückliches NULL fordert nie den Standardwert an.

Mehrere Zeilen zusammen hinzufügen
INSERT INTO customers (first_name, last_name, email) VALUES
  ('Ana', 'Ruiz', 'ana@example.com'),
  ('Ben', 'Okafor', 'ben@example.com'),
  ('Chloe', 'Nguyen', 'chloe@example.com');

In einer leeren Tabelle, deren generierter Schlüssel bei 1 beginnt, erhalten diese Kunden die IDs 1, 2 und 3. Bei gewöhnlicher Behandlung von Integritätsbedingungen gelingt oder scheitert die mehrzeilige Anweisung als Ganzes. Verstößt eine Zeile gegen eine Regel, wird keine Zeile dieser Anweisung eingefügt.

Ein UNIQUE-Fehler weist auf einen doppelten Schlüssel oder Wert hin; NOT NULL weist auf fehlende Daten hin; CHECK weist auf eine nicht erfüllte Bedingung hin; und ein Fremdschlüsselfehler weist auf eine ungültige Verknüpfung hin. Korrigiere den Wert oder seine beabsichtigte Zuordnung, bevor du es erneut versuchst.

Wichtige Erkenntnisse

  • Liste die Spalten auf und ordne ihnen jeden Wert anhand seiner Position zu.
  • Ausgelassene Felder erhalten Standardwerte oder NULL; generierte IDs benötigen einen Generator.
  • Verwende einfache Anführungszeichen für Text und verdopple einen enthaltenen Apostroph.
  • NULL und der Text NULL sind verschieden.
  • Eine normale mehrzeilige Einfügung schlägt als Ganzes fehl, wenn eine Zeile gegen eine Integritätsbedingung verstößt.

3.2 Abfrageergebnisse einfügen, neue Schlüssel zurückgeben und Duplikate behandeln

Zeilen müssen nicht einzeln eingegeben werden. Eine Abfrage kann die Zeilen für eine Einfügung liefern, und eine Konfliktregel kann festlegen, was geschieht, wenn ein eindeutiger Wert bereits existiert. Bei beiden Funktionen kommt es darauf an, genau die gewünschten Daten zu treffen.

Ein Abfrageergebnis kopieren
INSERT INTO archived_orders (id, customer_id, order_date, total)
SELECT id, customer_id, order_date, total
FROM orders
WHERE order_date < '2026-01-01';

Es gibt keine VALUES-Klausel: Die Abfrage liefert die Werte. Ordne ihre ausgewählten Spalten anhand ihrer Position der Zielliste zu. Die Zieltabelle muss bereits existieren, und ihre Regeln gelten weiterhin.

Sieh dir das SELECT zuerst allein an. Die Bestellungen 201, 202 und 204 haben die Datumswerte 2025-11-03, 2025-12-19 und 2025-10-30 sowie die Gesamtbeträge 45,00, 120,50 und 60,00. Die Bestellungen 203 und 205 stammen aus dem Jahr 2026. Die Abfrage gibt drei Zeilen mit einer Summe von 225,50 zurück, und die Einfügung kopiert diese drei. Sie kann auch null Zeilen kopieren, wenn der Filter nichts findet.

Ein zweiter Durchlauf versucht, sie erneut zu kopieren. Ein Primärschlüssel in der Zieltabelle lässt dies fehlschlagen, statt unbemerkt Duplikate zu speichern. INSERT ... SELECT ist ein Kopiervorgang; er entfernt weder die Quellzeilen noch hält er die beiden Tabellen synchron.

Dateiimporte laufen oft zuerst über eine Staging-Tabelle. Die Shell von SQLite verwendet .import --csv file.csv staging, psql verwendet \copy. In einer späteren Abfrage entfernt TRIM(email) umgebende Leerzeichen und NULLIF(TRIM(email), '') wandelt eine leere oder nur aus Leerzeichen bestehende E-Mail-Adresse in NULL um. Die Integritätsbedingungen der Zieltabelle prüfen anschließend die bereinigten Zeilen.

Das Ergebnis eines Schreibvorgangs auslesen
INSERT INTO customers (first_name, last_name, email)
VALUES ('Dev', 'Patel', 'dev@example.com')
RETURNING id;

Das Ergebnis liefert die generierte Kunden-ID zur Verwendung in einer zugehörigen Zeile. PostgreSQL und SQLite ab 3.35.0 unterstützen RETURNING bei Einfügungen, Aktualisierungen und Löschungen. MySQL verwendet LAST_INSERT_ID() für eine generierte ID; SQL Server verwendet OUTPUT.

Über den Umgang mit Duplikaten entscheiden

Nimm bei stock (sku TEXT PRIMARY KEY, qty INTEGER NOT NULL) an, dass 'LAMP-01' die Menge 12 hat. Eine einfache Einfügung mit derselben Artikelnummer und der Menge 20 schlägt fehl. In SQLite und PostgreSQL:

INSERT INTO stock (sku, qty) VALUES ('LAMP-01', 20)
ON CONFLICT (sku) DO UPDATE
SET qty = stock.qty + excluded.qty;

stock.qty ist der vorhandene Wert 12. excluded.qty ist der vorgesehene Wert 20. Diese Form speichert 32, was zu einer zusätzlichen Lieferung passt. SET qty = excluded.qty speichert 20, was zu einem ersetzenden Bestandswert passt. DO NOTHING behält 12 bei und überspringt die Zeile, die den Konflikt auslöst. Jede Variante geht von derselben ursprünglichen Menge 12 aus.

Ein Upsert verbindet das Einfügen einer neuen Zeile mit einer Aktualisierung bei einem Konflikt. Das Konfliktziel muss durch eine geeignete Eindeutigkeitsregel geschützt sein. Die entsprechende Anweisungsfamilie in MySQL ist ON DUPLICATE KEY UPDATE. Ein einfaches INSERT korrigiert keinen vorhandenen Kunden: Es erstellt entweder eine weitere Zeile oder stößt auf einen Eindeutigkeitsfehler. Verwende UPDATE für eine bekanntermaßen vorhandene Zeile und einen Upsert, wenn die Zeile bereits existieren könnte.

Wichtige Erkenntnisse

  • INSERT ... SELECT kopiert die Abfrageergebnisse in eine bestehende Tabelle.
  • Beim erneuten Kopieren muss der Umgang mit Duplikaten bewusst festgelegt werden.
  • RETURNING gibt Werte aus den tatsächlich geschriebenen Zeilen zurück.
  • excluded bezeichnet die zum Einfügen vorgesehene Zeile in einem Upsert.
  • Ersetze den Bestand mit excluded.qty; addiere eine Lieferung mit stock.qty + excluded.qty.
  • DO NOTHING überspringt einen Eindeutigkeitskonflikt, ohne die vorhandene Zeile zu aktualisieren.
4

Zeilen mit UPDATE ändern und mit DELETE löschen

Auch eine gültige datenändernde Anweisung kann die falschen Zeilen betreffen. Einen Preis zu aktualisieren, eine Bestellung zu entfernen und die zu ändernden Datensätze auszuwählen sind getrennte Entscheidungen. Du berechnest neue Werte aus gespeicherten Werten, unterscheidest das Leeren eines Feldes vom Löschen einer Zeile und erstellst Bedingungen mit Datumswerten, fehlenden Werten und gruppierten Alternativen. Eine Vorschau und eine Ergebnisprüfung machen die Wirkung sichtbar, bevor eine Transaktion die Änderung dauerhaft festschreibt.

4.1 Werte mit UPDATE ändern

UPDATE ändert Werte in bereits vorhandenen Zeilen. Die Anweisung nennt eine Tabelle, weist mit SET neue Werte zu und wählt dann mit WHERE die Zielzeilen aus. Die Integritätsbedingungen der Tabelle prüfen die entstehenden Werte.

Ein oder mehrere Felder setzen
UPDATE products
SET price = 22.50, in_stock = 30
WHERE id = 3;

Das Produkt mit dem Schlüssel 3 erhält beide Werte; andere Zeilen behalten ihre Werte. Zuweisungen werden durch Kommas getrennt. SET price = 22.50 AND in_stock = 30 bedeutet nicht zwei Zuweisungen. PostgreSQL lehnt dies ab; SQLite behandelt die rechte Seite als booleschen Ausdruck und kann 0 oder 1 im Preis speichern.

Ein fehlendes WHERE ist gültiges SQL und betrifft jede Zeile. UPDATE products SET price = 0; setzt den Preis jedes Produkts auf null, sofern die Regeln der Tabelle dies erlauben. Eine Vorschau mit der vorgesehenen Bedingung zeigt, ob eine Zeile, mehrere Zeilen oder keine getroffen werden.

Mit dem gespeicherten Wert rechnen
UPDATE products
SET price = price * 1.10;

Ein Preis von 20,00 wird nach einer Erhöhung um 10 % zu 22,00. Ein Preis von 19,99 ergibt ungerundet 21,989. PostgreSQL speichert in einer NUMERIC(8, 2)-Spalte 21,99. SQLite setzt die Dezimalstellenanzahl nicht durch, daher fordert SET price = ROUND(price * 1.10, 2) zwei Dezimalstellen an. Für eine exakte Speicherung von Geldbeträgen in SQLite speichere ganze Cent und lege ausdrücklich fest, wie Centbeträge gerundet werden.

Der Ausdruck muss den alten Wert enthalten, wenn die Änderung relativ ist. SET in_stock = in_stock - 1 entfernt eine Einheit; SET in_stock = 1 ersetzt den Bestand durch eins.

In SQLite und PostgreSQL lesen alle Ausdrücke auf der rechten Seite die Zeile vor der Aktualisierung. UPDATE t SET a = b, b = a; vertauscht die Werte einer Zeile von 1 und 2 zu 2 und 1. Bei einem Update einer einzelnen Tabelle wertet MySQL die Zuweisungen von links nach rechts aus, sodass dieselbe Form beide Werte auf 2 setzt. Übertrage diese Annahme nicht zwischen Systemen.

Regeln und fehlende Werte beachten

Verwende SET phone = NULL, um ein Telefonfeld zu leeren. Um fehlende Telefonwerte zu finden, verwende WHERE phone IS NULL. Ein Gleichheitsvergleich mit NULL findet sie nicht.

Betrachte die Preise 12,00, 3,00 und 8,50, die durch CHECK (price > 0) geschützt sind. Würdest du von jedem Preis 5 abziehen, würde der zweite zu −2,00. Bei gewöhnlicher Behandlung von Integritätsbedingungen macht dieser Fehler die ganze Anweisung rückgängig, sodass auch die ansonsten zulässigen Preise unverändert bleiben.

Auch eine Änderung des Primärschlüssels muss zugehörige Fremdschlüssel erfüllen. Eine blockierte Schlüsseländerung schlägt fehl, solange Kindzeilen auf den alten Schlüssel verweisen; ON UPDATE CASCADE überträgt den neuen Wert in diese Zeilen. Bleiben generierte IDs stabil, entfällt dieser zusätzliche Aufwand bei Änderungen beschreibender Angaben.

Die Anzahl betroffener Zeilen deuten

psql meldet ein Ergebnis wie UPDATE 3; changes() von SQLite meldet die Anzahl für die letzte Änderungsanweisung. Beide zählen auch getroffene und aktualisierte Zeilen, bei denen der zugewiesene Wert dem alten entspricht. Eine Anzahl von drei verspricht nicht drei sichtbar unterschiedliche Werte. Vergleiche die Anzahl mit der Vorschau und prüfe anschließend die betreffenden Felder oder verwende RETURNING, um betroffene Zeilen direkt zu sehen.

Wichtige Erkenntnisse

  • SET weist Werte zu; WHERE wählt Zeilen aus.
  • Trenne Zuweisungen durch Kommas, nicht durch AND.
  • Verwende bei einer relativen Berechnung den alten Spaltenwert.
  • Ein gewöhnlicher Verstoß gegen eine Integritätsbedingung macht die ganze UPDATE-Anweisung rückgängig.
  • Die Anzahl betroffener Zeilen kann Zeilen enthalten, deren Werte gleich geblieben sind.

4.2 Zeilen mit DELETE löschen

DELETE entfernt ganze Zeilen. Die Tabelle bleibt bestehen und kann wieder Zeilen aufnehmen. Um ein einzelnes Feld zu leeren, verwendest du UPDATE ... SET column = NULL; DELETE email FROM customers ist kein gültiges SQL.

Eine gefilterte Löschung nachvollziehen

Der Shop hat diese Bestellungen:

IDStatusBestelldatum
201storniert2025-11-03
202versandt2025-12-19
203storniert2026-01-08
204storniert2025-10-30
205abgelaufen2026-02-14
DELETE FROM orders
WHERE status = 'cancelled'
  AND order_date < '2026-01-01';

Bestellung 201 erfüllt beide Bedingungen, ebenso 204. Bestellung 203 ist storniert, aber zu neu; 202 ist alt genug, aber versandt. Die Anweisung entfernt zwei Zeilen und lässt 202, 203 und 205 bestehen. DELETE FROM orders; ohne die Bedingung würde alle fünf entfernen.

Zeilen anhand zugehöriger Daten auswählen
DELETE FROM order_items
WHERE order_id IN (
  SELECT id FROM orders WHERE status = 'cancelled'
);

Die innere Abfrage liefert die IDs stornierter Bestellungen. IN prüft die order_id jeder Position gegen diese Liste. Führe die innere Abfrage allein aus, um die Schlüssel zu prüfen, und sieh dir dann die Positionszeilen mit derselben Bedingung vorab an.

Auch Fremdschlüssel beeinflussen Löschungen. Eine Elternzeile, auf die Kindzeilen verweisen, kann durch NO ACTION oder RESTRICT geschützt werden; eine Kaskadierung entfernt Kindzeilen; SET NULL erhält Kindzeilen, entfernt aber die Verknüpfung. Prüfe diese Aktionen, wenn du die Wirkung des Löschens einer Elternzeile beurteilst, denn die direkt genannte Tabelle muss nicht die einzige geänderte Tabelle sein.

Wählen, was erhalten bleiben soll
AnweisungEntfernte ZeilenWas bleibt
DELETE ... WHERE ...Zutreffende ZeilenTabelle und übrige Zeilen
DELETE FROM orders;Alle ZeilenLeere Tabelle
TRUNCATE TABLE orders;Alle Zeilen, ohne WHERELeere Tabelle
DROP TABLE orders;Alle Zeilen mit der TabelleKeine Tabelle orders

PostgreSQL, MySQL, SQL Server und Oracle unterstützen TRUNCATE; SQLite nicht. Die Transaktions- und Abhängigkeitsregeln dafür unterscheiden sich je nach Datenbank. Auch eine Anweisung, die wie ein schnelles Leeren klingt, muss diese Regeln einhalten.

Die Historie durch logisches Löschen erhalten
UPDATE customers
SET deleted_at = '2026-03-15'
WHERE id = 7;

Beim logischen Löschen wird die Zeile markiert, ohne sie zu entfernen. Dadurch kann die Historie erhalten bleiben und die Zeile durch Entfernen der Markierung wiederhergestellt werden. Abfragen nach aktiven Kunden müssen WHERE deleted_at IS NULL enthalten; andernfalls erscheinen die markierten Kunden weiterhin. Das Markieren von Daten löscht sie nicht.

Eine festgeschriebene Löschung lässt sich durch ein späteres ROLLBACK nicht rückgängig machen. Für die Wiederherstellung braucht man eine gespeicherte Kopie oder Sicherung. Innerhalb einer offenen Transaktion kann ein Rollback gelöschte Zeilen noch wiederherstellen. Prüfe die ausgewählten IDs und die Anzahl betroffener Zeilen, bevor du das Ergebnis dauerhaft festschreibst.

Wichtige Erkenntnisse

  • DELETE entfernt Zeilen; UPDATE kann ein einzelnes Feld leeren.
  • Ein fehlendes WHERE leert die Tabelle, während ihre Struktur erhalten bleibt.
  • IN kann Zeilen mithilfe von Schlüsseln aus einer anderen Tabelle auswählen.
  • Fremdschlüsselaktionen können eine Löschung ausweiten oder blockieren.
  • Logisches Löschen erfordert Filter für aktive Zeilen und entfernt die gespeicherten Daten nicht.
  • ROLLBACK macht eine Löschung nur rückgängig, solange ihre Transaktion nicht festgeschrieben ist.

4.3 Genau die gemeinten Zeilen treffen

Die Auswahl der Zeilen ist oft der schwierigste Teil einer Änderung. Derselbe Filter, der in einer Abfrage harmlos ist, kann bei seiner Wiederverwendung in einem Schreibvorgang zu viel löschen oder aktualisieren. Formuliere die beabsichtigte Regel als Bedingung und prüfe dann, worauf sie tatsächlich zutrifft.

Genau die Bedingung vorab prüfen
SELECT id, status, order_date FROM orders
WHERE status = 'cancelled'
  AND order_date < '2026-01-01';

Diese Vorschau gibt im Shop-Beispiel mit fünf Bestellungen die Bestellungen 201 und 204 zurück. Verwende genau diese Bedingung für die Löschung. Wenn du sie beim Ändern des Befehls umformulierst, entsteht eine neue, ungeprüfte Auswahl.

Für eine bestimmte Zeile verwende ihren Primärschlüssel: WHERE id = 42 trifft höchstens eine Zeile. Mehrere Produkte können denselben beschreibenden Namen wie 'Desk lamp' haben.

Alternativen ausdrücklich gruppieren

AND bindet stärker als OR. Vergleiche:

WHERE status = 'cancelled'
   OR status = 'expired' AND order_date < '2026-01-01'

mit:

WHERE (status = 'cancelled' OR status = 'expired')
  AND order_date < '2026-01-01'

Die erste Bedingung akzeptiert jede stornierte Bestellung unabhängig vom Datum sowie vor 2026 abgelaufene Bestellungen. Sie trifft auf 201, 203 und 204 zu. Die zweite wendet die Datumsprüfung auf beide Statuswerte an und trifft auf 201 und 204 zu. Bestellung 203 zeigt den Unterschied, weil sie 2026 storniert ist.

Fehlende Werte bewusst einbeziehen

WHERE customer_id = NULL trifft keine Zeilen. Fehlende Werte brauchen IS NULL oder IS NOT NULL. Auch eine negative Prüfung hat eine Lücke: status <> 'shipped' schließt einen fehlenden Status nicht ein, weil das Vergleichsergebnis unbekannt ist.

Gehört ein fehlender Status zur vorgesehenen Gruppe, schreibe:

WHERE status <> 'shipped' OR status IS NULL

Wenn du eine weitere Bedingung hinzufügst, fasse diese ganze Alternative in Klammern, damit beide Zweige die weitere Bedingung erfüllen müssen.

Ein Mustervergleich kann mehr erfassen als die beabsichtigte Beschreibung. LIKE '%lamp%' trifft auf „Desk lamp“ und „Clamp“ zu. Das standardmäßige LIKE von SQLite ignoriert außerdem die Groß- und Kleinschreibung englischer Buchstaben und findet daher „Lamp shade“. Ein Muster ist nützlich, um mögliche Treffer zu finden. Prüfe diese Treffer aber, bevor du sie änderst.

Für eine Liste einen Listenvergleich wählen
UPDATE orders SET status = 'on hold'
WHERE customer_id IN (
  SELECT id FROM customers WHERE state = 'CA'
);

Die Unterabfrage kann mehrere Kunden-IDs liefern; IN prüft, ob ein Wert in der Liste enthalten ist. Ersetzt du IN durch =, wird ein einzelnes skalares Ergebnis verlangt. PostgreSQL lehnt dort mehrere Zeilen ab, während SQLite ohne Meldung die erste zurückgegebene Zeile verwendet und andere Kunden übersieht.

Vergleiche nach der Änderung die Anzahl betroffener Zeilen mit der Vorschau. PostgreSQL und SQLite können außerdem RETURNING * anhängen, um die betroffenen Zeilen anzuzeigen. Starte bei einem riskanten Schreibvorgang vor der Datenänderung eine Transaktion, prüfe das Ergebnis und wähle dann COMMIT oder ROLLBACK.

Wichtige Erkenntnisse

  • Prüfe genau die WHERE-Bedingung vorab, die der Schreibvorgang verwenden wird.
  • Ein Primärschlüsselfilter identifiziert höchstens eine Zeile.
  • Durch Klammern gilt eine AND-Bedingung für beide OR-Alternativen.
  • IS NULL behandelt fehlende Werte; gewöhnliche Vergleiche überspringen sie.
  • IN akzeptiert eine Liste aus einer Unterabfrage; ein skalarer Gleichheitsvergleich nicht.
  • Prüfe Anzahl und Ergebnis vor dem Festschreiben.
5

Änderungen zu Transaktionen zusammenfassen

Manche Änderungen gehören zusammen: Eine Überweisung braucht sowohl eine Abbuchung als auch eine Gutschrift. Bei Transaktionen kannst du gemeinsam über das Übernehmen oder Rückgängigmachen dieser Anweisungen entscheiden, während Sicherungspunkte die Rückkehr zu einem Zwischenstand erlauben. Du verfolgst Kontostände bei erfolgreichen Änderungen und Fehlern und vergleichst dann, wie SQLite und PostgreSQL eine fehlgeschlagene Anweisung behandeln. Die Datenbank- und Client-Einstellungen sind wichtig, besonders wenn eine Strukturänderung frühere Arbeit festschreiben kann.

5.1 Zusammengehörige Änderungen festschreiben oder zurücksetzen

Eine Transaktion fasst zusammengehörige Anweisungen zu einer Arbeitseinheit zusammen. Du entscheidest, ob du ihre Änderungen gemeinsam mit COMMIT übernimmst oder mit ROLLBACK rückgängig machst. Die Alles-oder-nichts-Eigenschaft heißt Atomarität, das A in ACID.

Beide Seiten einer Überweisung erhalten

Mayas Konto mit der ID 1 enthält 500,00. Leos Konto mit der ID 2 enthält 120,00. Um 75,00 zu überweisen, sind zwei Änderungen nötig:

BEGIN;
UPDATE accounts SET balance = balance - 75.00 WHERE id = 1;
UPDATE accounts SET balance = balance + 75.00 WHERE id = 2;
SELECT id, balance FROM accounts WHERE id IN (1, 2);
COMMIT;

Nach der ersten Aktualisierung hat Maya 425,00. Nach der zweiten hat Leo 195,00. Die Prüfung zeigt beide Kontostände vor dem Festschreiben, und die Summe bleibt 620,00. Verwende für diese exakten Dezimalkontostände PostgreSQL-NUMERIC; eine Variante für exakte Geldbeträge in SQLite speichert 50.000 und 12.000 Cent und überweist 7.500 Cent.

Ohne ausdrückliche Transaktion könnte bei Autocommit die erste Aktualisierung dauerhaft werden, bevor die zweite ausgeführt wird. Ein Absturz dazwischen würde die Abbuchung ohne die Gutschrift übernehmen. Eine Transaktion ermöglicht eine gemeinsame endgültige Entscheidung über das Übernehmen oder Rückgängigmachen beider Aktualisierungen. Schlägt eine Anweisung fehl, behandle den Fehler, bevor du die Überweisung als abgeschlossen betrachtest.

Die standardmäßige Transaktionsgrenze verstehen

Bei Autocommit der Datenbank wird jede erfolgreiche eigenständige Anweisung als eigene Transaktion festgeschrieben. Das ist das übliche Ausgangsverhalten von SQLite, PostgreSQL, MySQL und SQL Server. Eine Programmbibliothek oder ein Client kann andere Einstellungen wählen und eine Transaktion für dich starten.

BEGIN; startet in SQLite und PostgreSQL eine ausdrückliche Transaktion. SQLite und SQL Server verwenden auch BEGIN TRANSACTION; PostgreSQL und MySQL akzeptieren START TRANSACTION. Oracle startet eine Transaktion mit einer Datenänderung und wartet in Werkzeugen wie SQL*Plus gewöhnlich auf COMMIT, sofern Autocommit nicht eingeschaltet ist.

COMMIT beendet die Transaktion und übernimmt ihre Änderungen. ROLLBACK beendet sie und macht ihre nicht festgeschriebenen Änderungen rückgängig. Ein späteres Rollback kann ein früheres Commit nicht rückgängig machen.

Prüfen und rückgängig machen
BEGIN;
DELETE FROM orders;
SELECT * FROM orders;
ROLLBACK;

Deine Verbindung sieht beim SELECT eine leere Tabelle und nach dem Rollback wieder die fünf Bestellungen. Das leere Ergebnis war innerhalb der Transaktion tatsächlich vorhanden, aber noch nicht dauerhaft. Andere Verbindungen sehen die nicht festgeschriebenen Änderungen normalerweise nicht.

Eine Transaktion kann dich vor einer falschen Zeilenauswahl nur schützen, wenn du das Ergebnis prüfst und dich für das Rückgängigmachen entscheidest. SQL kann eine nicht beabsichtigte Zeile erfolgreich aktualisieren: Keine Datenbankregel weiß, welches Konto du nennen wolltest. Vergleiche zurückgegebene IDs, Werte und Anzahlen vor dem Festschreiben mit dem beabsichtigten Ergebnis.

Halte Transaktionen kurz und beende sie. Offene Transaktionen können Sperren halten, die andere Verbindungen zum Warten bringen; SQLite erlaubt jeweils nur eine schreibende Verbindung. Wird eine Verbindung mit einer unvollendeten Transaktion geschlossen, werden deren ausstehende Änderungen zurückgesetzt. Wenn eine Bibliothek automatisch eine Transaktion startet, muss das Programm deren Commit-Methode aufrufen, um die Änderungen zu übernehmen.

Wichtige Erkenntnisse

  • Atomarität ermöglicht, zusammengehörige Änderungen gemeinsam zu übernehmen oder rückgängig zu machen.
  • Autocommit schreibt eine erfolgreiche eigenständige Anweisung dauerhaft fest.
  • Deine Verbindung kann ihre eigenen ausstehenden Änderungen prüfen.
  • Sowohl COMMIT als auch ROLLBACK beenden die Transaktion.
  • ROLLBACK kann Änderungen aus einer früheren festgeschriebenen Transaktion nicht rückgängig machen.

5.2 Fehler, Sicherungspunkte und Strukturänderungen in einer Transaktion handhaben

Eine fehlgeschlagene Anweisung hat nicht in jeder Datenbank dieselbe Wirkung. Du musst wissen, was noch aussteht, bevor du über die Fehlerbehebung entscheidest. Ein Sicherungspunkt kann innerhalb einer offenen Transaktion eine nähere Stelle für die Rückkehr bieten.

Einen Fehler nachvollziehen

Nach der Überweisung hat Maya 425,00 und Leo 195,00. Die Tabelle hat CHECK (balance >= 0). Starte eine Transaktion und ziehe 30,00 von Mayas Konto ab: Ihr noch nicht festgeschriebener Kontostand beträgt 395,00. Versuche dann, 300,00 von Leos Konto abzuziehen. Dadurch würde sein Kontostand −105,00 betragen, sodass die zweite Anweisung fehlschlägt.

DatenbankZustand nach dem gewöhnlichen Fehler bei einer Integritätsbedingung
SQLiteDie fehlgeschlagene Anweisung wird rückgängig gemacht; Mayas frühere Änderung steht noch aus.
PostgreSQLDie Transaktion ist fehlgeschlagen und weitere gewöhnliche Befehle werden abgelehnt.

Ein Festschreiben an dieser Stelle würde in SQLite nur Mayas Abzug übernehmen. In PostgreSQL beendet COMMIT die fehlgeschlagene Transaktion mit einem Rollback. Ein klarer Ablauf zur Fehlerbehebung ist, ROLLBACK auszuführen, die Ursache zu korrigieren und die zusammengehörigen Anweisungen erneut auszuführen. Beide Kontostände kehren dadurch vor dem korrigierten Versuch zu 425,00 und 195,00 zurück.

Einen späteren Teil mit einem Sicherungspunkt rückgängig machen
BEGIN;
UPDATE accounts SET balance = balance + 10 WHERE id = 1;
SAVEPOINT after_first;
UPDATE accounts SET balance = balance + 10 WHERE id = 2;
ROLLBACK TO after_first;
COMMIT;

Der Sicherungspunkt steht nach Mayas Erhöhung. ROLLBACK TO macht Leos spätere Erhöhung rückgängig, erhält aber die von Maya. Die endgültigen Kontostände betragen 435,00 und 195,00. Die Anweisung beendet die äußere Transaktion nicht; das tut COMMIT.

RELEASE after_first entfernt den Sicherungspunkt, ohne die danach vorgenommenen Änderungen rückgängig zu machen. Es ist kein eigenständiges dauerhaftes Festschreiben innerhalb der äußeren Transaktion. PostgreSQL erlaubt außerdem, mit ROLLBACK TO auf einen vor einem Fehler erstellten Sicherungspunkt den Fehlerzustand aufzuheben und von dort fortzufahren.

Prüfen, ob Strukturänderungen zurückgesetzt werden können

SQLite und PostgreSQL erlauben CREATE TABLE, ALTER TABLE und DROP TABLE innerhalb von Transaktionen. Zum Beispiel stellt BEGIN; DROP TABLE orders; ROLLBACK; die Tabelle und ihre Zeilen wieder her.

Gewöhnliche DDL-Anweisungen für dauerhafte Tabellen lösen in MySQL und Oracle implizite Commits aus. Ein CREATE TABLE, ALTER TABLE, DROP TABLE oder TRUNCATE TABLE kann neben seiner eigenen strukturellen Operation auch frühere ausstehende Änderungen festschreiben. Ein späteres Rollback kann diese frühere Arbeit nicht rückgängig machen. Geh nicht davon aus, dass eine Transaktion um ein Skript bewirkt, dass sich alle Datenbankdialekte gleich verhalten.

Beginne bei einer riskanten Datenänderung die Transaktion, führe den Schreibvorgang aus, prüfe seine Werte und die Anzahl und schreibe dann fest oder setze zurück. Prüfe zum Beispiel die Beleuchtungspreise nach UPDATE products SET price = ROUND(price * 1.10, 2) WHERE category = 'lighting';. Triff die Entscheidung zügig, damit die Transaktion andere Arbeiten nicht warten lässt.

Wichtige Erkenntnisse

  • Ein gewöhnlicher Fehler bei einer Integritätsbedingung lässt frühere Transaktionsänderungen in SQLite ausstehend.
  • Ein PostgreSQL-Fehler lässt die Transaktion bis zum Rollback oder zur Wiederherstellung an einem Sicherungspunkt im Fehlerzustand.
  • ROLLBACK TO macht spätere Arbeit rückgängig, ohne die Transaktion zu beenden.
  • RELEASE entfernt einen Sicherungspunkt, ohne die äußere Transaktion festzuschreiben.
  • Ob sich DDL zurücksetzen lässt, hängt von der Datenbank ab.
6

Die Tabellenstruktur mit ALTER TABLE und DROP TABLE ändern

Tabellen brauchen manchmal ein neues Feld, einen klareren Namen oder eine strengere Regel, nachdem sie bereits Daten enthalten. Für eine solche Strukturänderung musst du die vorhandenen Zeilen und die von der Tabelle abhängigen Objekte prüfen. Du fügst Spalten hinzu und füllst sie, erkennst, wann SQLite einen Neuaufbau benötigt, und unterscheidest das Entfernen von Datensätzen vom Entfernen ihres Behälters. Abhängigkeiten bestimmen auch die Arbeitsreihenfolge, wenn zusammengehörige Tabellen außer Gebrauch genommen werden.

6.1 Spalten mit ALTER TABLE hinzufügen, umbenennen und entfernen

ALTER TABLE ändert die Struktur einer bestehenden Tabelle und erhält ihre Zeilen. UPDATE ändert die Werte in diesen Zeilen. Das Hinzufügen eines Rabattfeldes braucht ALTER TABLE; das Erhöhen bereits gespeicherter Rabatte braucht UPDATE.

Felder hinzufügen und umbenennen
ALTER TABLE customers ADD COLUMN phone TEXT;
ALTER TABLE customers RENAME COLUMN phone TO mobile;
ALTER TABLE customers RENAME TO clients;

SQLite und PostgreSQL unterstützen diese Formen gleichermaßen. Eine neue Spalte gibt vorhandenen Zeilen ihren Standardwert oder NULL, wenn sie keinen hat. ADD COLUMN active INTEGER NOT NULL DEFAULT 1 gibt jeder vorhandenen Zeile für active den Wert 1. Das Hinzufügen von email TEXT NOT NULL ohne Standardwert schlägt bei einer gefüllten Tabelle fehl, weil den vorhandenen Zeilen ein erforderlicher Wert fehlen würde.

SQLite unterstützt RENAME COLUMN ab 3.25.0 und DROP COLUMN ab 3.35.0. Aktualisiere beim Umbenennen Anwendungscode und gespeicherte Abfragen, die auf den alten Namen verweisen. SQL außerhalb der Datenbank kann den neuen Namen nicht automatisch ermitteln.

Daten füllen, bevor sie vorgeschrieben werden

Füge in PostgreSQL eine Spalte hinzu, die NULL zulässt, fülle die vorhandenen Zeilen mit passenden Werten und schreibe den Wert erst dann vor:

ALTER TABLE customers ADD COLUMN email TEXT;
UPDATE customers SET email = 'unknown@example.com'
WHERE email IS NULL;
ALTER TABLE customers ALTER COLUMN email SET NOT NULL;

Dies zeigt das Füllen eines Pflichtfeldes; es deklariert die E-Mail-Adresse nicht als eindeutig. Eine echte eindeutige E-Mail-Spalte braucht unterschiedliche gültige Werte. SET NOT NULL schlägt fehl, wenn fehlende Werte verbleiben. PostgreSQL unterstützt auch das Ändern eines Typs mit ALTER COLUMN price TYPE NUMERIC(10, 2), das Setzen eines Standardwerts und das Hinzufügen einer benannten Prüfbedingung. Vorhandene Zeilen müssen eine neu hinzugefügte Regel erfüllen.

Ein Feld entfernen oder eine Tabelle neu aufbauen

ALTER TABLE customers DROP COLUMN mobile; entfernt das Feld und alle darin gespeicherten Werte. Abhängigkeiten können den Vorgang blockieren. SQLite lehnt das Entfernen einer Primärschlüssel-, eindeutigen, indizierten oder Fremdschlüsselspalte ab, ebenso einer Spalte, die von einem anderen Schemaobjekt verwendet wird. PostgreSQL kann abhängige Objekte mit CASCADE entfernen, darunter eine Sicht, die die Spalte verwendet.

SQLite kann mit einem einfachen ALTER weder den Typ einer bestehenden Spalte ändern noch Primärschlüssel-, Eindeutigkeits-, Fremdschlüssel- oder CHECK-Bedingungen zu bestehenden Spalten hinzufügen. Version 3.53.0 ergänzt ALTER COLUMN ... SET NOT NULL und DROP NOT NULL, aber keine allgemeine Bearbeitung von Integritätsbedingungen. Eine neu hinzugefügte Spalte kann eine Prüfbedingung oder einen erlaubten Verweis haben, aber kein PRIMARY KEY oder UNIQUE; bei eingeschalteter Fremdschlüsselprüfung benötigt ein hinzugefügter Verweis NULL als Standardwert.

Für eine umfassendere Änderung in SQLite:

  1. Halte die Indizes, Trigger und Sichten fest, die erneut erstellt werden müssen. Sind Fremdschlüssel eingeschaltet, schalte sie vor der Transaktion aus.
  2. Starte eine Transaktion und erstelle eine neue Tabelle mit den gewünschten Regeln.
  3. Kopiere Zeilen mit ausdrücklichen Spaltenangaben in INSERT INTO new_products (...) SELECT ... FROM products;.
  4. Entferne die alte Tabelle und benenne die neue in products um.
  5. Erstelle abhängige Objekte erneut und führe PRAGMA foreign_key_check; aus. Behebe gemeldete Probleme vor dem Festschreiben.
  6. Schreibe fest und schalte die Fremdschlüsselprüfung danach wieder ein, falls sie zuvor eingeschaltet war.

MySQL ändert Definitionen mit MODIFY COLUMN; SQL Server verwendet ALTER COLUMN. Übertrage eine Strukturänderung vor der Ausführung in die von der Zieldatenbank unterstützte Syntax.

Wichtige Erkenntnisse

  • ALTER TABLE ändert die Struktur; UPDATE ändert gespeicherte Werte.
  • Hinzugefügte Spalten geben vorhandenen Zeilen einen Standardwert oder NULL.
  • Fülle eine neue Pflichtspalte, bevor du NOT NULL hinzufügst.
  • Das Entfernen einer Spalte löscht ihre Werte und kann durch Abhängigkeiten blockiert werden.
  • SQLite benötigt für viele Typ- und Integritätsbedingungsänderungen einen Neuaufbau.
  • Beim Neuaufbau müssen abhängige Objekte erhalten und Fremdschlüssel geprüft werden.

6.2 Tabellen mit DROP TABLE entfernen

DROP TABLE entfernt den Behälter ebenso wie seinen Inhalt. Nach DROP TABLE archived_orders; können Abfragen diese Tabelle nicht mehr lesen, weil sie nicht mehr existiert. Ihre Integritätsbedingungen, Indizes und Trigger werden mit ihr entfernt.

Den Umfang des Entfernens wählen
Gewünschtes ErgebnisAnweisung
Tabelle behalten und ausgewählte Zeilen entfernenDELETE FROM orders WHERE ...;
Eine leere Tabelle behaltenDELETE FROM orders;
Eine Tabelle schnell leeren, wo unterstütztTRUNCATE TABLE orders;
Die Tabelle selbst entfernenDROP TABLE orders;

DROP TABLE IF EXISTS archived_orders; vermeidet einen Fehler, wenn die Tabelle nicht vorhanden ist. Eine vorhandene Tabelle und ihre Daten werden dennoch entfernt. Ein Einrichtungsskript, das Tabellen entfernt und erneut erstellt, zerstört Daten, wenn es auf einer Datenbank mit Datensätzen ausgeführt wird, die du behalten möchtest.

Verknüpfungen zwischen Tabellen beachten

Entferne Kindtabellen vor Elterntabellen, also in umgekehrter Reihenfolge zur üblichen Erstellung. In PostgreSQL schlägt das Entfernen von customers fehl, solange ein Fremdschlüssel einer Bestellung davon abhängt. DROP TABLE customers CASCADE; entfernt auch den abhängigen Fremdschlüssel und alle abhängigen Sichten. Die Bestelltabelle und ihre Zeilen bleiben bestehen, aber die Kundenbeziehung wird nicht mehr durchgesetzt.

Dieses PostgreSQL-CASCADE unterscheidet sich vom ON DELETE CASCADE eines Fremdschlüssels. Das erste entfernt abhängige Datenbankobjekte bei einer Strukturänderung. Das zweite entfernt Kindzeilen, wenn eine Elternzeile gelöscht wird. Wenn du weißt, welche Aktion verwendet wird, vermeidest du eine falsche Vorhersage über die verbleibenden Daten.

Bei eingeschalteter SQLite-Fremdschlüsselprüfung führt das Entfernen einer Tabelle zuerst eine implizite Löschung ihrer Zeilen aus. Verweisende Kindzeilen können dies blockieren. Deklariert die Beziehung ON DELETE CASCADE, können diese Kindzeilen gelöscht werden; SET NULL kann ihre Verknüpfungen aufheben. Beim Entfernen einer Tabelle musst du daher ebenso wie beim Löschen auf Verweise und zusätzlich auf die entfernte Tabellenstruktur achten.

Eine Wiederherstellung ermöglichen

Bewahre eine verwendbare Kopie auf, bevor du eine Tabelle mit echten Daten entfernst oder neu aufbaust. Eine schnelle interne Datenkopie ist:

CREATE TABLE products_backup AS
SELECT * FROM products;

In SQLite und PostgreSQL erhält dies die ausgewählten Daten, aber nicht die ursprünglichen Integritätsbedingungen. Es dient nicht als vollständige Rekonstruktion der Tabellendefinition. Ein Export oder eine Datenbanksicherung bewahrt Daten zur Wiederherstellung außerhalb der geänderten Tabelle auf.

SQLite und PostgreSQL erlauben auch, das Entfernen innerhalb einer Transaktion zu testen:

BEGIN;
DROP TABLE archived_orders;
ROLLBACK;

Das Rollback stellt die Tabelle und ihre Zeilen wieder her, weil das Entfernen nicht festgeschrieben wurde. Nach dem Festschreiben kann das Entfernen durch ein späteres ROLLBACK nicht rückgängig gemacht werden. In Datenbanken mit impliziten DDL-Commits bietet eine Transaktionssyntax um das Entfernen diese Möglichkeit zum Rückgängigmachen nicht. Prüfe die Zieldatenbank und die beteiligten Tabellen, bevor du ein Skript zum Neuaufbau ausführst.

Wichtige Erkenntnisse

  • DROP TABLE entfernt die Tabelle und ihre Zeilen, Integritätsbedingungen, Indizes und Trigger.
  • IF EXISTS unterdrückt einen Fehler bei fehlender Tabelle, nicht das Löschen einer vorhandenen Tabelle.
  • Entferne Kindtabellen vor ihren Elterntabellen.
  • PostgreSQL DROP CASCADE entfernt abhängige Objekte, während Kindtabellen bestehen bleiben können.
  • Eine reine Datenkopie erhält die ursprünglichen Integritätsbedingungen nicht.

Datenbanktabellen erstellen und ändern: Beispiele

6 Interaktive Lektionen

1

Eine Produkttabelle erstellen und prüfen

11 Schritte
Definiere eine leere Tabelle, prüfe ihre Spalten und wähle eine zu jedem Wert passende Speicherung.
  1. 1
    EinführungMit einem Produkt beginnen

    Ein Shop muss ID, Name, Preis und Lagerbestand eines Produkts festhalten. Eine Tabellendefinition gibt jeder Angabe ein eigenes Feld, bevor Produktzeilen hinzugefügt werden.

    Wir erstellen die Struktur, prüfen sie und sehen dann nach, ob die Typen die Bedeutung der Werte erhalten. Die Beispiele verwenden SQLite und nennen die Änderungen für PostgreSQL, wo sie das Ergebnis beeinflussen.

  2. 2
    ErklärungEine Spaltendefinition lesen

    In name TEXT NOT NULL ist name der Bezeichner des Feldes, TEXT beschreibt seine Speicherung und NOT NULL schreibt einen Wert vor.

    Die Tabelle listet diese Definitionen in Klammern auf, durch Kommas getrennt. Das Semikolon beendet die Erstellungsanweisung. Das Erstellen der Struktur ist DDL; es fügt keine Produktzeilen hinzu. Ein späteres INSERT liefert diese Zeilen.

  3. 3
    BeispielVier Felder erstellen
    CREATE TABLE products (
      id INTEGER PRIMARY KEY,
      name TEXT NOT NULL,
      price NUMERIC(8, 2) NOT NULL,
      in_stock INTEGER DEFAULT 0
    );
    

    Es gibt vier Spaltendefinitionen und drei trennende Kommas. SQLite generiert diesen ganzzahligen Primärschlüssel. PostgreSQL benötigt eine Identitätsdeklaration, wenn eine ausgelassene ID generiert werden soll.

  4. 4
    TippDie tatsächliche Definition prüfen

    Verwende PRAGMA table_info(products); in SQLite-SQL oder .schema products in dessen Kommandozeilen-Shell. In PostgreSQL-psql verwendest du \d products.

    Die Prüfung deckt mehr als Syntaxfehler auf. SQLite kann ein fehlendes Komma als Teil eines mehrteiligen Typnamens lesen, sodass eine Spalte entsteht, wo du zwei erwartet hast. SELECT * FROM products; zeigt eine leere Tabelle, aber dass sie null Zeilen enthält, bestätigt nicht jede Regel.

  5. 5
    HerausforderungRepariert das eine alte Tabelle?

    Eine ältere Tabelle products hat nur id und name. Ein Skript führt CREATE TABLE IF NOT EXISTS products (...) mit vier gewünschten Spalten aus. Wie viele Spalten hat die bestehende Tabelle danach?

    ---reveal---

    Sie hat weiterhin zwei. IF NOT EXISTS überspringt die Erstellung, wenn der Name vorhanden ist. Es vergleicht die Definitionen nicht und fügt die fehlenden Felder nicht hinzu. Für eine Strukturänderung brauchst du ALTER TABLE oder einen gezielten Neuaufbau.

  6. 6
    ErklärungMengen von Codes unterscheiden

    Speichere Mengen als Zahlen, damit Rechnen und numerisches Sortieren funktionieren. Speichere Codes als Text, wenn ihre Zeichen Bedeutung tragen.

    Die US-Postleitzahl '02139' verliert als Ganzzahl ihre führende Null. Die Textwerte '100', '25' und '9' werden in dieser Zeichenreihenfolge sortiert, was für numerische Mengen falsch ist. Die Entscheidung richtet sich danach, wie das Feld verwendet wird, nicht danach, ob seine Beispiele Ziffern enthalten.

  7. 7
    BeispielGenauigkeit und Dezimalstellenanzahl lesen

    PostgreSQL-NUMERIC(8, 2) erlaubt insgesamt acht Ziffern, davon zwei nach dem Komma. Damit bleiben sechs davor, bis 999.999,99.

    Ein Wert von 12,345 wird als 12,35 gespeichert. Ein Wert von 1.234.567,00 schlägt fehl, weil er sieben Ziffern vor dem Komma benötigt. SQLite akzeptiert dieselbe Deklaration, setzt aber diese Genauigkeit oder Dezimalstellenanzahl nicht durch, sodass sich diese Vorhersage nicht auf SQLite übertragen lässt.

  8. 8
    KernaussageGeldbeträge exakt speichern

    Binäre Gleitkommadarstellung kann winzige Unterschiede in Dezimalrechnungen verursachen. SELECT 0.1 + 0.2 = 0.3; liefert in SQLite falsch.

    Verwende PostgreSQL-NUMERIC für exakte Dezimalbeträge. Speichere in SQLite ganze Cent als Ganzzahlen: 1.999 steht für 19,99. Die Angabe NUMERIC(8, 2) in SQLite erzeugt keine exakte Dezimalspeicherung mit fester Dezimalstellenanzahl. Näherungstypen eignen sich weiterhin für Messwerte wie Temperaturen.

  9. 9
    HerausforderungDatumswerte in der richtigen Reihenfolge halten

    Eine SQLite-Tabelle speichert Datumswerte als Text. Warum hilft es bei einer aufsteigenden Datumssortierung, '12/01/2025' und '03/15/2026' in ISO-Datumswerte umzuwandeln?

    ---reveal---

    Die ISO-Formen sind '2025-12-01' und '2026-03-15'. Der Textvergleich prüft dann Jahr, Monat und Tag in dieser Reihenfolge und stellt das frühere Datum voran. Text mit dem Monat zuerst vergleicht den Monat, bevor er das Jahr erreicht, und bringt diese beiden Datumswerte in die falsche Reihenfolge.

  10. 10
    HerausforderungTabelle und Typ prüfen

    Ein SQLite-Skript erstellt eine fehlende Tabelle mit CREATE TABLE IF NOT EXISTS readings (qty INTEGER);. Eine Einfügung übergibt 'abc' als qty und gelingt. Was solltest du prüfen, bevor du annimmst, dass qty immer Zahlen enthält?

    ---reveal---

    Prüfe die tatsächliche Definition, denn IF NOT EXISTS könnte eine ältere Tabelle übersprungen haben. Berücksichtige außerdem die gewöhnliche Typaffinität von SQLite: Eine Ganzzahldeklaration kann weiterhin nicht numerischen Text speichern. Eine geeignete STRICT-Tabelle verstärkt die Typprüfung.

  11. 11
    ZusammenfassungDie Struktur auf die Verwendung abstimmen

    Eine Erstellungsanweisung definiert Felder, Typen und Regeln; eine Einfügung liefert die Datensätze. Prüfe die vorhandene Struktur, statt anzunehmen, dass ein erfolgreiches Skript die von dir beabsichtigte Definition erstellt hat.

    Frag dich bei jedem Feld, was erhalten bleiben muss: numerische Berechnungen, exakte Centbeträge, Zeichen einer Kennung oder die zeitliche Reihenfolge. Berücksichtige das Typverhalten der Zieldatenbank, wenn du das gespeicherte Ergebnis vorhersagst.

2

Produkte und Kundenverknüpfungen schützen

13 Schritte
Verfolge die Prüfung von Integritätsbedingungen, wähle generierte Schlüssel und sage Fremdschlüsselaktionen voraus.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungDaten an der Datenbank prüfen
  2. 2
    ErklärungJeder Regel eine Aufgabe geben
  3. 3
    BeispielEine akzeptierte Zeile verfolgen
  4. 4
    HerausforderungErsetzt ein Standardwert ein ausdrückliches NULL?
  5. 5
    KernaussageEin unbekanntes Prüfergebnis besteht die Prüfung
  6. 6
    ErklärungDie ganze Zeile identifizieren
  7. 7
    BeispielDas System die ID wählen lassen
  8. 8
    HerausforderungIst die nächste ID eine Zeilenanzahl?
  9. 9
    ErklärungJede Bestellung mit ihrem Kunden verknüpfen
  10. 10
    BeispielEine Kaskadierung verfolgen
  11. 11
    HerausforderungDie Bestellungen nach dem Entfernen erhalten
  12. 12
    HerausforderungDie erforderlichen Regeln kombinieren
  13. 13
    ZusammenfassungWerte, Identität und Verknüpfungen prüfen
3

Produkte einfügen und Bestellungen kopieren

11 Schritte
Ordne Werte Spalten zu, prüfe kopierte Zeilen und unterscheide das Ersetzen vom Hinzufügen von Lagerbestand.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungDie Herkunft neuer Zeilen wählen
  2. 2
    BeispielEin Produkt zuordnen
  3. 3
    TippLiterale richtig übernehmen
  4. 4
    HerausforderungDie ausdrückliche Liste lesen
  5. 5
    ErklärungEine Gruppe mit einer Anweisung hinzufügen
  6. 6
    BeispielDie Archivabfrage vorab prüfen
  7. 7
    BeispielDie Abfrage als Eingabe verwenden
  8. 8
    ErklärungDie vorgesehene Zeile benennen
  9. 9
    HerausforderungBehalten oder ersetzen?
  10. 10
    HerausforderungOhne Raten kopieren und verknüpfen
  11. 11
    ZusammenfassungDie Eingabe durch den Schreibvorgang verfolgen
4

Genau die vorgesehenen Zeilen ändern

14 Schritte
Wende berechnete Aktualisierungen an, verfolge Löschungen und prüfe Filter, bevor du eine Änderung übernimmst.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungWas geändert wird und welche Zeilen betroffen sind unterscheiden
  2. 2
    BeispielZwei neue Werte zuweisen
  3. 3
    BeispielEinen Preis ausgehend vom alten Wert erhöhen
  4. 4
    HerausforderungÄndern sich die anderen Preise?
  5. 5
    ErklärungEine Zeile entfernen oder ein Feld leeren
  6. 6
    BeispielDie alten stornierten Bestellungen verfolgen
  7. 7
    HerausforderungDie Historie eines gelöschten Kunden erhalten
  8. 8
    TippDie Bedingung der Vorschau wiederverwenden
  9. 9
    BeispielAND vor OR anwenden
  10. 10
    HerausforderungEine Datumsregel auf beide Statuswerte anwenden
  11. 11
    KernaussageEin negativer Vergleich übersieht NULL
  12. 12
    HerausforderungEine Liste von Kundenschlüsseln verwenden
  13. 13
    HerausforderungEin Update aller Zeilen untersuchen
  14. 14
    ZusammenfassungBedeutung und Wirkung prüfen
5

Eine vollständige Änderung übernehmen oder rückgängig machen

12 Schritte
Verfolge eine Überweisung, behebe Fehler und verwende einen Sicherungspunkt, ohne die äußere Transaktion zu verlieren.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungEine Überweisung braucht zwei Änderungen
  2. 2
    ErklärungEine gemeinsame Grenze öffnen
  3. 3
    BeispielDen Überweisungsbetrag abziehen
  4. 4
    BeispielDie Gutschrift hinzufügen und prüfen
  5. 5
    HerausforderungDie ganze ausstehende Überweisung rückgängig machen
  6. 6
    BeispielEine fehlgeschlagene Kontostandsänderung verfolgen
  7. 7
    ErklärungJe nach Datenbank wiederherstellen
  8. 8
    HerausforderungEine unvollständige Operation nicht übernehmen
  9. 9
    BeispielEinen Zwischenstand markieren
  10. 10
    KernaussageRELEASE ist kein Commit der äußeren Transaktion
  11. 11
    HerausforderungKann dieses Entfernen rückgängig gemacht werden?
  12. 12
    ZusammenfassungMit einer bewussten Entscheidung abschließen
6

Eine gefüllte Tabelle ändern oder entfernen

13 Schritte
Füge erforderliche Daten schrittweise hinzu, baue SQLite-Tabellen bei Bedarf neu auf und beachte Abhängigkeiten beim Entfernen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungMit bereits vorhandenen Datensätzen arbeiten
  2. 2
    BeispielEin Feld hinzufügen, das NULL zulässt
  3. 3
    HerausforderungEin Feld nach dem Füllen vorschreiben
  4. 4
    TippJede externe Verwendung umbenennen
  5. 5
    ErklärungEin eingeschränktes ALTER erkennen
  6. 6
    BeispielDen Ersatz vorbereiten
  7. 7
    BeispielKopieren, ersetzen und prüfen
  8. 8
    ErklärungEntscheiden, ob die Tabelle bleiben soll
  9. 9
    BeispielAbhängigkeiten in PostgreSQL verfolgen
  10. 10
    HerausforderungDie zwei Bedeutungen der Kaskadierung unterscheiden
  11. 11
    TippDaten und Definition wiederherstellbar halten
  12. 12
    HerausforderungRegeln beim Neuaufbau erhalten
  13. 13
    ZusammenfassungDie Struktur und ihre Abhängigkeiten verfolgen

Datenbanktabellen erstellen und ändern: Übungsaufgaben

50 Übungsfragen in 5 Sets

Set 1: Tabellen erstellen und erste Änderungen vornehmen10 Übungsfragen

Frage 1 von 10

Ein neues SQLite-Feld muss den Kontocode 00481 exakt erhalten. Welcher Speichertyp passt?
  1. INTEGER
  2. TEXT
  3. REAL
  4. NUMERIC(5, 0)
Antwort zeigenAntwort ausblenden
Antwort: B
Der Code ist eine Kennung, deren Zeichen erhalten bleiben müssen; Text bewahrt daher die beiden führenden Nullen. Bei numerischer Speicherung haben diese Nullen keine numerische Wirkung, und die Schreibweise bleibt nicht erhalten. Die numerische Genauigkeit beschreibt die Zahlenspeicherung, kein Kennungsformat mit fester Länge.

Frage 2 von 10

Eine PostgreSQL-Spalte verwendet NUMERIC(6, 2). Was ist ihr größter positiver Wert?
  1. 999999,99
  2. 99,9999
  3. 999999
  4. 9999,99
Antwort zeigenAntwort ausblenden
Antwort: D
Die Genauigkeit beträgt insgesamt sechs Ziffern, und die Dezimalstellenanzahl reserviert zwei davon für Nachkommastellen. Damit bleiben vier vor dem Komma. Das Maximum ist daher 9.999,99. Würdest du sechs als Anzahl der Ziffern vor dem Komma auffassen, wären insgesamt zu viele Ziffern erlaubt.

Frage 3 von 10

Eine SQLite-Spalte lautet qty INTEGER NOT NULL DEFAULT 4 CHECK (qty >= 0). Eine Einfügung gibt ausdrücklich NULL für qty an. Was geschieht?
  1. Die Einfügung verstößt gegen NOT NULL.
  2. Die Zeile wird mit der Menge 4 eingefügt.
  3. Die Zeile wird mit der Menge 0 eingefügt.
  4. Die Zeile wird mit der Menge NULL eingefügt.
Antwort zeigenAntwort ausblenden
Antwort: A
Ein ausdrückliches NULL wird als angegebener fehlender Wert geprüft und verstößt daher gegen NOT NULL. Der Standardwert 4 wird verwendet, wenn die Spalte ausgelassen wird, nicht wenn ausdrücklich ein fehlender Wert gesendet wird. Die Prüfung auf einen nicht negativen Wert ersetzt nicht die Pflicht zur Wertangabe.

Frage 4 von 10

Eine PostgreSQL-Tabelle benötigt generierte IDs, wenn Einfügungen id auslassen. Welche Spaltendefinition bewirkt das?
  1. id INTEGER PRIMARY KEY NOT NULL CHECK (id > 0)
  2. id INTEGER UNIQUE NOT NULL DEFAULT 1
  3. id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY
  4. id INTEGER NOT NULL CHECK (id >= 1)
Antwort zeigenAntwort ausblenden
Antwort: C
Eine Identitätsdeklaration liefert einen durch eine Sequenz generierten Wert, während der Primärschlüssel die Identität der Zeile sichert. Ein einfacher ganzzahliger Primärschlüssel prüft nur angegebene Werte; er generiert keine ausgelassene ID. Ein konstanter Standardwert von 1 würde denselben Wert wiederholen, statt neue IDs zu generieren.

Frage 5 von 10

Fremdschlüssel werden geprüft. Eine Kindzeile verwendet supplier_id = 18, aber Lieferant 18 existiert nicht. Was muss geschehen, damit genau dieser Verweis ohne NULL erfolgreich eingefügt werden kann?
  1. Der Kindzeile zuerst einen anderen Primärschlüssel geben.
  2. Die Kindzeile vor dem Hinzufügen des Lieferanten festschreiben.
  3. Zuerst die passende Lieferantenzeile erstellen.
  4. Für supplier_id einen Standardwert außer NULL festlegen.
Antwort zeigenAntwort ausblenden
Antwort: C
Der angegebene Wert der Kindzeile muss zu einem vorhandenen Schlüssel der Elterntabelle passen. Lieferant 18 muss daher bei der gewöhnlichen sofortigen Prüfung existieren, bevor dieser Verweis eingefügt wird. Ein anderer Schlüssel der Kindzeile behebt die fehlende Elternzeile nicht. Ein Standardwert ersetzt die ausdrücklich angegebene 18 nicht.

Frage 6 von 10

Eine Tabelle deklariert name vor code. Eine Einfügung verwendet (code, name) mit den Werten ('R7', 'Notebook'). Was wird in name gespeichert?
  1. Der Text Notebook.
  2. Der Text R7.
  3. Der Text R7, Notebook.
  4. Ein fehlender Wert, NULL.
Antwort zeigenAntwort ausblenden
Antwort: A
Die ausdrückliche Spaltenliste steuert die Zuordnung: Der zweite Wert kommt in die zweite aufgeführte Spalte, name. Die Reihenfolge der Tabellendeklaration setzt diese Liste nicht außer Kraft. Würdest du die Werte in Tabellenreihenfolge lesen, würdest du Code und Name fälschlich vertauschen.

Frage 7 von 10

Eine Zeile hat für qty den Wert 9. Welche Zuweisung verringert die gespeicherte Menge um 3?
  1. SET qty = 3
  2. SET qty = 9 - qty
  3. SET qty = qty * 3
  4. SET qty = qty - 3
Antwort zeigenAntwort ausblenden
Antwort: D
Der neue Wert muss aus der gespeicherten Menge berechnet werden, sodass das Abziehen von 3 den Wert 6 ergibt. Die Zuweisung der Konstante 3 ersetzt die Menge durch 3 und bedeutet keine Verringerung um 3. Wird die Spalte im Ausdruck verwendet, gilt dieselbe relative Änderung auch für andere Mengen.

Frage 8 von 10

Eine Tabelle enthält 12 Zeilen. DELETE FROM logs; gelingt. Was bleibt bestehen?
  1. Die Definition von logs und alle 12 Zeilen.
  2. Eine leere Tabelle logs mit ihrer Definition.
  3. Keine Tabelle logs und keine verbleibenden Zeilen.
  4. Eine Zeile in logs mit fehlenden Werten.
Antwort zeigenAntwort ausblenden
Antwort: B
Ohne Filter entfernt DELETE alle 12 Zeilen und lässt die Tabellenstruktur für spätere Einfügungen bestehen. Es entfernt keine Spalten und ersetzt die Datensätze nicht durch fehlende Werte. Das Entfernen der Tabelle selbst erfordert DROP TABLE, einen separaten Strukturvorgang.

Frage 9 von 10

Eine SQLite-Verbindung führt BEGIN aus, ändert eine Menge von 8 auf 11 und führt dann ROLLBACK aus. Welche Menge liest diese Verbindung danach?
  1. 11
  2. 3
  3. 0
  4. 8
Antwort zeigenAntwort ausblenden
Antwort: D
Die Änderung von 8 auf 11 stand in der offenen Transaktion noch aus. Ein vollständiges Rollback macht sie rückgängig und stellt den früheren Wert 8 wieder her. Die Erhöhung um 3 ist der Änderungsbetrag, nicht die wiederhergestellte Menge; kein festgeschriebener Schritt hat 11 dauerhaft gemacht.

Frage 10 von 10

Eine PostgreSQL-Tabelle hat vorhandene Zeilen und keine Telefonspalte. Jede Zeile muss schließlich ihren eigenen echten Telefonwert haben, und kein einzelner Standardwert ist geeignet. Welche Reihenfolge erfüllt diese Anforderung?
  1. phone mit NULL-Zulassung hinzufügen; gültige Telefonnummern einfüllen; NOT NULL setzen.
  2. phone mit NOT NULL hinzufügen; gültige Telefonnummern einfüllen; den Standardwert entfernen.
  3. phone mit NULL-Zulassung hinzufügen; NOT NULL setzen; gültige Telefonnummern einfüllen.
  4. phone mit DEFAULT NULL hinzufügen; NOT NULL setzen; gültige Telefonnummern einfüllen.
Antwort zeigenAntwort ausblenden
Antwort: A
Das Hinzufügen eines Feldes, das NULL zulässt, hält vorhandene Datensätze gültig, während ihre echten Telefonnummern eingefüllt werden. Erst wenn alle fehlenden Werte ergänzt sind, kann SET NOT NULL gelingen. Werden die Werte vor dem Füllen vorgeschrieben, schlägt das fehl, weil die vorhandenen Zeilen noch NULL enthalten würden.
Set 2: Häufige SQL-Fehler erkennen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine SQLite-Tabelle labels hat bereits nur die Spalten id und text. Ein Skript führt CREATE TABLE IF NOT EXISTS labels (id INTEGER PRIMARY KEY, text TEXT, color TEXT); aus. Was geschieht mit color?
  1. Die Spalte wird hinzugefügt und mit fehlenden Werten gefüllt.
  2. Die Spalte ersetzt die vorhandene Spalte text.
  3. Die Spalte wird der bestehenden Tabelle nicht hinzugefügt.
  4. Die Spalte wird erst nach der nächsten Einfügung hinzugefügt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Skript führt CREATE TABLE tickets (id INTEGER PRIMARY KEY, label TEXT); aus. Es werden keine weiteren Anweisungen ausgeführt. Was existiert danach?
  1. Eine Tabelle mit einer Zeile für jede Spalte.
  2. Eine leere Tabelle mit zwei Spalten.
  3. Eine leere Tabelle nur mit der Spalte id.
  4. Zwei leere Tabellen namens id und label.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

In PostgreSQL hat ein score-Wert, der NULL zulässt, nur CHECK (score BETWEEN 0 AND 100). Eine Einfügung gibt NULL an. Was geschieht?
  1. Der Wert wird abgelehnt, weil die Prüfung falsch ist.
  2. Der Wert wird als untere Bereichsgrenze null gespeichert.
  3. Der Wert wird akzeptiert, nachdem NULL zu 100 wird.
  4. Der Wert wird akzeptiert, weil die Prüfung unbekannt ist.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Ein Projekt hat zwei Aufgaben. Deren Fremdschlüssel project_id verwendet ON DELETE SET NULL, und project_id ist zusätzlich NOT NULL. Fremdschlüssel werden geprüft. Was geschieht, wenn das Projekt gelöscht wird?
  1. Das Löschen schlägt fehl; Projekt und beide Aufgaben bleiben.
  2. Das Projekt wird entfernt und beide Aufgaben werden entknüpft.
  3. Das Projekt und seine beiden Aufgaben werden entfernt.
  4. Das Löschen gelingt und beide Aufgaben behalten den alten Schlüssel.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Der Lagerbestand für Code R2 beträgt 7. Ein eingehender Datensatz meldet einen ersetzenden Bestand von 11. Welche Upsert-Zuweisung speichert den gewünschten Bestand?
  1. SET qty = stock.qty + excluded.qty
  2. SET qty = excluded.qty
  3. SET qty = stock.qty - excluded.qty
  4. SET qty = stock.qty
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Tabelle hat fehlende und vorhandene Statuswerte. Ein Schreibvorgang muss jede Zeile treffen, deren Status nicht bezahlt ist, einschließlich fehlender Statuswerte. Welche Bedingung funktioniert?
  1. status <> 'paid' AND status IS NULL
  2. status <> 'paid' OR status = NULL
  3. status <> 'paid' OR status IS NULL
  4. status <> 'paid' AND status IS NOT NULL
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Ein Schreibvorgang muss Farbe und Menge einer Zeile setzen. Wie werden die beiden Zuweisungen innerhalb von SET getrennt?
  1. Durch ein Komma.
  2. Durch ein AND.
  3. Durch ein WHERE.
  4. Durch ein weiteres SET.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine SQLite-Transaktion beginnt mit den Kontoständen 80 und 40. Eine erste Aktualisierung zieht 15 vom ersten Kontostand ab. Eine zweite zieht 50 vom zweiten ab und verstößt gegen CHECK (balance >= 0). Was würde COMMIT bei gewöhnlicher Behandlung von Integritätsbedingungen übernehmen?
  1. Die Kontostände 80 und 40.
  2. Die Kontostände 65 und −10.
  3. Die Kontostände 80 und −10.
  4. Die Kontostände 65 und 40.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine gefüllte SQLite-Tabelle erhält active INTEGER NOT NULL DEFAULT 1. Welchen active-Wert haben ihre vorhandenen Zeilen?
  1. NULL
  2. 1
  3. 0
  4. Ihre Zeilen-IDs.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine temporäre Archivtabelle soll einschließlich ihrer Zeilen und Definition nicht mehr existieren. Welche Anweisung entfernt sie?
  1. DELETE FROM archive;
  2. TRUNCATE TABLE archive;
  3. DROP TABLE archive;
  4. ALTER TABLE archive RENAME TO old_archive;
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Die gespeicherten Ergebnisse nachvollziehen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Ein PostgreSQL-Feld ist NUMERIC(5, 2). Was geschieht mit einem eingefügten Wert von 48,726?
  1. Er wird als 48,73 gespeichert.
  2. Er wird als 48,72 gespeichert.
  3. Er wird als 48,726 gespeichert.
  4. Er scheitert, weil er insgesamt fünf Ziffern überschreitet.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Tabelle hat UNIQUE (room_id, start_time). Sie enthält (4, '09:00') und (5, '09:00'). Was geschieht beim Einfügen von (4, '10:00')?
  1. Es schlägt fehl, weil Raum 4 wiederholt wird.
  2. Es schlägt fehl, weil zwei Räume 09:00 teilen.
  3. Es ersetzt den Datensatz für Raum 4.
  4. Es gelingt, weil das Paar neu ist.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

In einer gewöhnlichen SQLite-Tabelle wird ein vorgeschriebener Textprimärschlüssel als code TEXT PRIMARY KEY deklariert. Welche zusätzliche Regel schließt die historische Ausnahme von SQLite für fehlende Schlüssel?
  1. DEFAULT NULL hinzufügen.
  2. CHECK (code = code) hinzufügen.
  3. NOT NULL hinzufügen.
  4. Ein weiteres UNIQUE hinzufügen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine gewöhnliche mehrzeilige Einfügung in PostgreSQL sieht drei Datensätze vor. Der letzte wiederholt einen vorhandenen eindeutigen Code. Was geschieht mit den ersten beiden vorgesehenen Datensätzen?
  1. Beide werden vor dem Fehler eingefügt.
  2. Keiner wird durch diese Anweisung eingefügt.
  3. Nur der erste Datensatz wird eingefügt.
  4. Beide werden mit fehlenden Codes eingefügt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine SQLite-Tabelle hat eine generierte id, einen vorgeschriebenen name und qty INTEGER NOT NULL DEFAULT 6. Welche Einfügung fügt eine Bürste unter Verwendung dieses Standardwerts hinzu?
  1. INSERT INTO tools (name, qty) VALUES ('Brush', NULL);
  2. INSERT INTO tools (name, qty) VALUES ('Brush', DEFAULT);
  3. INSERT INTO tools (id, name) VALUES ('Brush', 6);
  4. INSERT INTO tools (name) VALUES ('Brush');
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine Kundenzeile muss erhalten bleiben, aber ihr optionaler Telefonwert soll fehlen. Welche Anweisung bewirkt das?
  1. DELETE FROM clients WHERE id = 28;
  2. UPDATE clients SET phone = NULL WHERE id = 28;
  3. UPDATE clients SET phone = 'NULL' WHERE id = 28;
  4. ALTER TABLE clients DROP COLUMN phone;
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Fälle sind 71 (geschlossen, 2025-08-01), 72 (offen, 2026-02-02), 73 (geschlossen, 2026-03-01) und 74 (abgelaufen, 2025-09-01). Welche IDs erfüllen state = 'closed' OR state = 'expired' AND opened < '2026-01-01'?
  1. 71, 73 und 74.
  2. Nur 71 und 74.
  3. Nur 71 und 73.
  4. Nur 73 und 74.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine ausdrückliche Transaktion erhöht einen Zählwert von 5 auf 8. Vor dem Festschreiben fragt dieselbe Verbindung die Zeile ab. Welchen Zählwert liest sie?
  1. 5
  2. 3
  3. 8
  4. Bis zum Festschreiben keine Zeile.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Transaktion beginnt mit den Zählern a = 2 und b = 7. Sie erhöht a um 3, setzt den Sicherungspunkt s, erhöht b um 4, führt ROLLBACK TO s aus und schreibt fest. Was bleibt?
  1. a = 5 und b = 7.
  2. a = 2 und b = 7.
  3. a = 5 und b = 11.
  4. a = 2 und b = 11.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

In PostgreSQL verweist invoices über einen Fremdschlüssel auf clients. DROP TABLE clients CASCADE; gelingt. Was kann von invoices erhalten bleiben?
  1. Die Tabelle, ohne ihre Rechnungszeilen.
  2. Die Zeilen, noch mit dem alten Fremdschlüssel verknüpft.
  3. Keine Tabelle invoices, weil sie auf clients verwies.
  4. Die Zeilen und die Tabelle, ohne diesen Fremdschlüssel.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Eine zuverlässige Reihenfolge wählen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

In SQLite gelingt CREATE TABLE t (a INTEGER b TEXT);. Die Prüfung zeigt nur Spalte a. Warum?
  1. SQLite erstellt b erst nach der ersten Einfügung.
  2. SQLite fasst gleiche Datentypen zu einer Spalte zusammen.
  3. SQLite behandelt b als fehlenden Standardwert.
  4. SQLite liest die übrigen Wörter als einen Typnamen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine PostgreSQL-Tabelle mit Identitätsspalte hat derzeit die IDs 2, 6 und 9. Wie viele Zeilen gibt COUNT(*) zurück?
  1. 9
  2. 7
  3. 3
  4. 6
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Fremdschlüssel werden geprüft. Team 8 hat die Mitglieder 81 und 82; Team 9 hat Mitglied 83. Der Fremdschlüssel der Mitglieder lässt NULL zu und hat ON DELETE SET NULL. Wie viele Mitglieder bleiben nach dem Löschen von Team 8 mit einem Team verknüpft?
  1. Drei Mitglieder, keines ohne Verknüpfung.
  2. Ein Mitglied, zwei ohne Verknüpfung.
  3. Ein Mitglied, die anderen zwei gelöscht.
  4. Kein Mitglied, drei ohne Verknüpfung.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Bei eingeschaltetem Autocommit und ohne ausdrückliche Transaktion enthält eine Quelle die IDs 61 und 62 vor einem Stichtag und ID 63 danach. Ein leeres Ziel hat einen Primärschlüssel auf id. Ein gefiltertes INSERT SELECT kopiert IDs vor dem Stichtag, dann wird genau dieselbe Anweisung ohne Konfliktklausel erneut ausgeführt. Was enthält das Ziel am Ende?
  1. IDs 61 und 62 je einmal; die zweite Kopie schlägt fehl.
  2. IDs 61 und 62 je zweimal; beide Kopien gelingen.
  3. IDs 61, 62 und 63 je einmal; die zweite Kopie schlägt fehl.
  4. Keine Zielzeilen; die zweite Kopie macht die erste rückgängig.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Eine PostgreSQL-Lagerzeile hat den Code K8 und für qty den Wert 14. Eine Anweisung schlägt (K8, 6) mit ON CONFLICT (code) DO UPDATE SET qty = stock.qty + excluded.qty vor. Dieselbe Anweisung wird danach erneut ausgeführt. Welcher qty-Wert wird gespeichert?
  1. 20
  2. 12
  3. 26
  4. 14
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Ein erfolgreiches SQLite-Update trifft vier Zeilen, die alle bereits active = 1 haben, und setzt active = 1. Welche Anzahl meldet changes()?
  1. 0
  2. 1
  3. 8
  4. 4
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Bestellungen haben folgende Angaben: 91 (storniert, 2025-04-01), 92 (NULL, 2025-05-01), 93 (storniert, 2026-02-01), 94 (bezahlt, 2025-06-01). Welche Bedingung trifft stornierte Bestellungen oder solche mit fehlendem Status nur vor 2026?
  1. (status = 'cancelled' OR status IS NULL) AND day < '2026-01-01'
  2. status = 'cancelled' OR status IS NULL AND day < '2026-01-01'
  3. (status = 'cancelled' OR status = NULL) AND day < '2026-01-01'
  4. (status = 'cancelled' AND status IS NULL) AND day < '2026-01-01'
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Bei eingeschaltetem Autocommit gelingt ein eigenständiges UPDATE. Ein zweites eigenständiges UPDATE schlägt fehl, und danach wird ROLLBACK ausgeführt. Was geschieht mit dem ersten Update?
  1. Es wird ebenfalls rückgängig gemacht.
  2. Es bleibt festgeschrieben.
  3. Es wartet auf ein COMMIT.
  4. Es wird danach erneut ausgeführt.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Tabellen hängen in dieser Reihenfolge voneinander ab: line_items verweist auf sales, und sales verweist auf buyers. Alle drei müssen ohne Kaskadierung entfernt werden. Welche Reihenfolge entspricht ihren Abhängigkeiten?
  1. buyers, dann sales, dann line_items.
  2. sales, dann line_items, dann buyers.
  3. line_items, dann sales, dann buyers.
  4. line_items, dann buyers, dann sales.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine SQLite-Tabelle wird mit CREATE TABLE saved AS SELECT * FROM original; kopiert. Was sollte geprüft werden, bevor saved als vollständiger Ersatz betrachtet wird?
  1. Die Integritätsbedingungen, die nicht kopiert wurden.
  2. Die Zeilen, die immer fehlen.
  3. Die Quellverknüpfung, die dauerhaft aktualisiert wird.
  4. Der Name, der weiterhin original sein muss.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 5: Regeln auf kombinierte Änderungen anwenden10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Eine gewöhnliche SQLite-Tabelle deklariert value NUMERIC(7, 2). Das Einfügen von 6,789 gelingt. Welchen gespeicherten Wert solltest du allein aufgrund dieser Deklaration erwarten?
  1. 6,79
  2. 6,789
  3. 6,78
  4. 679
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein PostgreSQL-Feld ist label TEXT NOT NULL ohne weitere Regeln. Was geschieht, wenn der angegebene Wert eine leere Zeichenkette ist?
  1. Sie wird als vorhandener leerer Text akzeptiert.
  2. Sie wird als fehlender Wert abgelehnt.
  3. Sie wird vor dem Speichern mit einem Leerzeichen aufgefüllt.
  4. Sie wird nach Umwandlung in NULL akzeptiert.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

In SQLite mit eingeschalteter Fremdschlüsselprüfung lautet eine Kindverknüpfung parent_id INTEGER DEFAULT 90 REFERENCES parents(id) ON DELETE SET DEFAULT. Elternzeile 90 existiert nicht. Kindzeile 12 verweist auf Elternzeile 7. Was geschieht, wenn Elternzeile 7 gelöscht wird?
  1. Die Kindzeile bleibt und ihre Verknüpfung wird zu 90.
  2. Die Kindzeile bleibt und ihre Verknüpfung wird zu NULL.
  3. Die Elternzeile und ihre Kindzeile werden beide gelöscht.
  4. Das Löschen schlägt fehl, weil zum Standardwert keine Elternzeile existiert.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine Lagerzeile hat die Menge 9. Zwei Lieferdatensätze schlagen jeweils 4 vor, beide führen aber DO UPDATE SET qty = excluded.qty aus. Welche Menge ist nach beiden Importen gespeichert und welche Gesamtmenge hätte eine korrekte Addition ergeben?
  1. Gespeichert 4; korrekte Gesamtmenge 13.
  2. Gespeichert 8; korrekte Gesamtmenge 17.
  3. Gespeichert 4; korrekte Gesamtmenge 17.
  4. Gespeichert 9; korrekte Gesamtmenge 8.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Ein geprüfter Fremdschlüssel verwendet die standardmäßige blockierende Löschaktion. Eine Buchung ist die einzige Zeile, die auf Kunde 44 verweist. Wie kann Kunde 44 entfernt werden, während diese Buchung mit dem gültigen vorhandenen Kunden 45 verknüpft bleibt?
  1. Die Buchung auf 45 ändern; Kunde 44 löschen.
  2. Kunde 44 löschen; die Buchung auf 45 ändern.
  3. Den Buchungsschlüssel leeren; Kunde 44 behalten.
  4. Kunde 45 löschen; die Buchung auf 44 ändern.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Eine PostgreSQL-Abfrage nach berechtigten Kunden gibt die IDs 31 und 34 zurück. Die Bestellungen beider Kunden müssen aktualisiert werden. Der Code verwendet customer_id = (SELECT id FROM customers WHERE eligible = TRUE). Was geschieht und welcher Vergleich behebt das Problem?
  1. Beide Kunden werden aktualisiert; Gleichheit beibehalten.
  2. Der erste Kunde wird aktualisiert; IN verwenden.
  3. Mehrere Zeilen verursachen einen Fehler; IN verwenden.
  4. Kein Kunde wird aktualisiert; IS NULL verwenden.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Die Kontostände der Konten 1 und 2 betragen anfangs 300 und 90. Eine Transaktion überweist 40 von Konto 1 auf Konto 2 und schreibt fest. Eine neue Transaktion addiert 10 zu Konto 2, setzt den Sicherungspunkt s, addiert 5 zu Konto 1, setzt auf s und dann vollständig zurück. Welche Kontostände bleiben?
  1. 300 und 90, Summe 390.
  2. 260 und 140, Summe 400.
  3. 265 und 140, Summe 405.
  4. 260 und 130, Summe 390.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Eine PostgreSQL-Transaktion aktualisiert Zeile A, setzt den Sicherungspunkt s und verstößt dann beim Aktualisieren von B gegen eine Prüfbedingung. Was kann die Transaktion wiederherstellen und dabei A ausstehend lassen?
  1. RELEASE s ausführen und dann fortfahren.
  2. ROLLBACK TO s ausführen und dann fortfahren.
  3. COMMIT ausführen und die Transaktion fortsetzen.
  4. Vor einem Rollback ein weiteres UPDATE B ausführen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Ein SQLite-Neuaufbau benötigt eine neue Prüfbedingung und hat abhängige Indizes sowie eingeschaltete Fremdschlüsselprüfungen. Welche Reihenfolge erhält die vorgesehenen Regeln und prüft Verweise?
  1. Beginnen; Fremdschlüsselprüfung ausschalten; ohne Regeln kopieren; ersetzen; festschreiben; Prüfung einschalten; Objekte später prüfen.
  2. Fremdschlüsselprüfung ausschalten; beginnen; ohne Regeln kopieren; ersetzen; Fremdschlüssel prüfen; festschreiben; Prüfung ausgeschaltet lassen.
  3. Fremdschlüsselprüfung ausschalten; beginnen; definieren und kopieren; ersetzen; festschreiben; Fremdschlüssel prüfen; abhängige Indizes verwerfen.
  4. Fremdschlüsselprüfung ausschalten; beginnen; definieren und kopieren; ersetzen und Objekte wiederherstellen; Fremdschlüssel prüfen; festschreiben; Prüfung einschalten.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Eine PostgreSQL-Lagerbestandsspalte enthält 5, NULL und −2. Sie soll NOT NULL mit CHECK (stock >= 0) werden, wobei alle Zeilen erhalten bleiben. Fehlende Bestände sollen zu 0 werden und negative Bestände korrigiert werden. Welche Reihenfolge führt beide Regeln ein?
  1. DEFAULT 0 setzen; −2 korrigieren; beide Bedingungen hinzufügen.
  2. NULL-Werte mit 0 füllen; −2 korrigieren; beide Bedingungen hinzufügen.
  3. NULL-Werte mit 0 füllen; −2 behalten; beide Bedingungen hinzufügen.
  4. NULL-Werte mit 0 füllen; −2 korrigieren; nur die Prüfbedingung hinzufügen.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

70 Schlüsselbegriffe, jeweils mit Definition

A

Abhängigkeit
Eine Abhängigkeit besteht, wenn ein Datenbankobjekt auf der Definition eines anderen Objekts beruht. Das kann das Entfernen oder Ändern dieses Objekts blockieren.
Ein Fremdschlüssel in Bestellungen hängt von Kunden ab, sodass das Entfernen der Kunden zuerst fehlschlagen kann, solange die Verknüpfung besteht.
ADD COLUMN
Die Operation ADD COLUMN erweitert eine Tabelle um ein neues Feld und gibt vorhandenen Zeilen dessen Standardwert oder NULL, wenn kein Standardwert deklariert ist.
Das Hinzufügen von active INTEGER NOT NULL DEFAULT 1 gibt vorhandenen Kunden den neuen Wert 1 ohne separate Einfügungen.
ALTER TABLE
Die Anweisung ALTER TABLE ändert die Definition einer bestehenden Tabelle, etwa ihre Spalten oder Integritätsbedingungen, und erhält dabei ihre Zeilen.
Das Hinzufügen eines Telefonfeldes ändert die Struktur mit ALTER TABLE; das spätere Füllen der Telefonwerte verwendet UPDATE.
Anzahl betroffener Zeilen
Die Anzahl betroffener Zeilen gibt an, wie viele Zeilen eine Anweisung aktualisiert hat; SQLite und PostgreSQL zählen auch getroffene Zeilen, denen ihre aktuellen Werte zugewiesen wurden.
Ein Update, das drei vorhandene Aktivkennzeichen auf ihre bisherigen Werte setzt, kann trotzdem drei aktualisierte Zeilen melden.
Atomarität
Atomarität ist die Alles-oder-nichts-Eigenschaft, die es ermöglicht, zusammengehörige Änderungen einer Transaktion als eine Operation zu übernehmen oder rückgängig zu machen.
Eine abgeschlossene Überweisung muss beide Kontostandsänderungen übernehmen; nur die Abbuchung zu übernehmen würde die Operation unvollständig lassen.
Autocommit
Autocommit schreibt jede erfolgreiche eigenständige Anweisung als eigene Transaktion fest, sofern die Sitzung keine ausdrückliche Transaktion geöffnet hat.
Zwei Kontostandsaktualisierungen bei Autocommit können getrennt dauerhaft werden und eine Lücke hinterlassen, wenn der Vorgang stoppt.
AUTOINCREMENT
Das SQLite-Schlüsselwort AUTOINCREMENT verhindert mit zusätzlichem Aufwand, dass ein generierter ganzzahliger Primärschlüssel Nummern erneut verwendet, die festgeschriebene Zeilen hatten.
Nach den festgeschriebenen IDs 1, 2 und 3 führt das Löschen von 3 weiterhin dazu, dass die nächste durch AUTOINCREMENT generierte ID 4 ist.

B

benannte Integritätsbedingung
Eine benannte Integritätsbedingung hat einen gewählten Bezeichner, der hilft, die Regel in Fehlermeldungen zu finden und bei späteren Strukturänderungen darauf zu verweisen.
CONSTRAINT price_positive CHECK (price > 0) gibt der Regel für einen positiven Preis einen Namen für die spätere Pflege.
Bezeichner
Ein Bezeichner ist der Name eines Datenbankobjekts, etwa einer Tabelle oder Spalte; doppelte Anführungszeichen erlauben darin Leerzeichen oder reservierte Wörter.
Der Spaltenbezeichner "order date" benötigt Anführungszeichen, während order_date Leerzeichen vermeidet und leichter wiederzuverwenden ist.

C

CHECK
Eine CHECK-Bedingung prüft eine Bedingung für eine Zeile und lehnt ein falsches Ergebnis ab; ein durch NULL unbekanntes Ergebnis wird akzeptiert.
CHECK (price > 0) lehnt einen negativen Preis ab, braucht aber zusätzlich NOT NULL, wenn ein Preis angegeben werden muss.
COMMIT
Der Befehl COMMIT beendet eine Transaktion, indem er ihre ausstehenden Änderungen dauerhaft festschreibt. Danach kann ein späteres Rollback diese Arbeit nicht rückgängig machen.
Nach der Prüfung beider Kontostände übernimmt das Festschreiben Abbuchung und Gutschrift als abgeschlossene Überweisung.
CREATE TABLE
Die Anweisung CREATE TABLE erstellt eine neue Tabelle mit benannten Spalten, deklarierten Typen und optionalen Regeln, zunächst ohne Zeilen.
CREATE TABLE labels (id INTEGER PRIMARY KEY, name TEXT); bereitet eine Tabelle vor, bevor Bezeichnungen eingefügt werden.
CREATE TABLE AS
Die Anweisung CREATE TABLE AS erstellt eine Tabelle aus Abfrageergebnissen und kopiert in SQLite und PostgreSQL ausgewählte Daten ohne die Integritätsbedingungen der Quelle.
Eine Kopie cheap_products enthält die bei ihrer Erstellung ausgewählten Produkte, auch nachdem sich die Preise in der Quelle ändern.

D

Datendefinitionssprache
Die Datendefinitionssprache, kurz DDL, ist die Gruppe von SQL-Anweisungen, die Datenbankstrukturen erstellt, ändert und entfernt.
CREATE TABLE, ALTER TABLE und DROP TABLE ändern die Struktur der Datenbank in verschiedenen Phasen.
Datenmanipulationssprache
Die Datenmanipulationssprache, kurz DML, ist die Gruppe von SQL-Anweisungen, die Zeilen in bestehenden Tabellen hinzufügt, ändert und entfernt.
Eine Bestellung wird mit INSERT hinzugefügt, ihr Status mit UPDATE korrigiert und ihre Zeile mit DELETE entfernt.
Datentyp
Ein Datentyp beschreibt die Art der Werte, die eine Spalte speichert, und bestimmt mit, wie sie verglichen, sortiert und verrechnet werden.
Eine Menge wird für Summen als Zahl gespeichert, während eine US-Postleitzahl als Text gespeichert wird, um ihre führenden Nullen zu erhalten.
DEFAULT
Ein DEFAULT liefert einen Wert, wenn eine Einfügung eine Spalte auslässt; ein ausdrücklich angegebener fehlender Wert wird dadurch nicht ersetzt.
Das Auslassen einer Lagerbestandsspalte mit DEFAULT 0 ergibt null, während ein ausdrücklich angegebenes NULL fehlend bleibt.
DELETE
Die Anweisung DELETE entfernt ganze, durch eine Bedingung ausgewählte Zeilen oder jede Zeile, wenn keine Bedingung angegeben ist. Die Tabelle bleibt erhalten.
Das Löschen alter stornierter Bestellungen lässt andere Bestellungen bestehen und erhält die Tabelle für künftige Einfügungen.
Dezimalstellenanzahl
Die Dezimalstellenanzahl eines Dezimaltyps ist die Anzahl der Ziffern nach dem Komma; PostgreSQL rundet gespeicherte Werte auf diese Anzahl.
Eine PostgreSQL-Spalte NUMERIC(8, 2) speichert 12,345 als 12,35, weil die deklarierte Dezimalstellenanzahl zwei beträgt.
DROP CASCADE
PostgreSQLs DROP CASCADE entfernt abhängige Objekte zusammen mit dem benannten Objekt, darunter verweisende Fremdschlüssel und abhängige Sichten.
Das Entfernen der Kunden mit CASCADE kann Bestellungen gespeichert lassen, aber den Fremdschlüssel entfernen, der sie mit Kunden verknüpft hat.
DROP COLUMN
Die Operation DROP COLUMN entfernt eine Spalte und ihre gespeicherten Werte aus einer Tabelle und kann durch abhängige Regeln oder Objekte blockiert werden.
Das Entfernen eines Mobiltelefonfeldes verwirft alle gespeicherten Mobiltelefonwerte und lässt die anderen Felder der Kunden unverändert.
DROP TABLE
Die Anweisung DROP TABLE entfernt eine Tabelle zusammen mit allen ihren Zeilen und ihren eigenen Integritätsbedingungen, Indizes und Triggern aus der Datenbank.
Nach dem Entfernen der Archivtabelle schlägt das Einfügen in sie fehl, bis erneut eine Tabelle mit diesem Namen erstellt wird.

E

Elterntabelle
Eine Elterntabelle enthält den referenzierten Schlüssel in einer Fremdschlüsselbeziehung, sodass ihre passenden Zeilen vor abhängigen Kindzeilen existieren müssen.
Die Kundentabelle ist die Elterntabelle, wenn die Kunden-ID jeder Bestellung auf den Primärschlüssel des Kunden verweist.
excluded
Der Name excluded verweist bei einer Konfliktaktualisierung in PostgreSQL oder SQLite auf die zum Einfügen vorgesehene Zeile und macht ihre eingehenden Werte verfügbar.
Für eine Lieferung addiert stock.qty + excluded.qty die vorgesehene eingehende Menge zur bereits gespeicherten Menge.

F

fehlgeschlagene Transaktion
Eine fehlgeschlagene Transaktion in PostgreSQL entsteht nach einem Anweisungsfehler und lehnt gewöhnliche Befehle bis zum Rollback oder zur Wiederherstellung an einem früheren Sicherungspunkt ab.
Nach einem abgelehnten Kontostandsupdate wird ein weiteres SELECT abgelehnt, bis der Fehlerzustand der Transaktion aufgehoben wird.
Fremdschlüssel
Ein Fremdschlüssel verlangt bei eingeschalteter Prüfung, dass vorhandene Werte der Kindtabelle zu einem referenzierten Primärschlüssel oder eindeutigen Schlüssel der Elterntabelle passen.
Eine Bestellung mit Kunden-ID 99 schlägt fehl, wenn kein Kunde 99 existiert und die Kundenbeziehung geprüft wird.
Fremdschlüsselprüfung
Die Fremdschlüsselprüfung ist die aktive Prüfung von Verweisen und deklarierten Aktionen durch die Datenbank, wenn zugehörige Zeilen eingefügt, geändert oder entfernt werden.
SQLite benötigt PRAGMA foreign_keys = ON; für die Verbindung vor einer Transaktion, um seine deklarierten Verknüpfungen zu prüfen.

G

Genauigkeit bei NUMERIC
Die Genauigkeit bei NUMERIC ist die deklarierte Gesamtzahl der Dezimalziffern einschließlich der Ziffern vor und nach dem Komma.
PostgreSQL NUMERIC(8, 2) erlaubt sechs Ziffern vor und zwei nach dem Komma, bis 999.999,99.
Gleitkommadarstellung
Die Gleitkommadarstellung stellt Zahlen als binäre Näherungswerte dar. Sie ermöglicht effiziente Berechnungen mit Messwerten, aber auch kleine dezimale Rundungsfehler.
SQLite kann 0.1 + 0.2 = 0.3 als falsch auswerten, weil seine Dezimalliterale näherungsweise gespeichert werden.

I

Identitätsspalte
Eine Identitätsspalte generiert in PostgreSQL Werte aus einer Sequenz, wenn eine Einfügung für diese Spalte einen generierten Wert anfordert.
INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY liefert neue IDs, ohne dass bei jeder Einfügung eine Nummer von Hand angegeben wird.
IF EXISTS
Die Klausel IF EXISTS unterdrückt in einer Anweisung zum Entfernen einen Fehler bei einem fehlenden Objekt, entfernt das benannte Objekt aber weiterhin, wenn es existiert.
DROP TABLE IF EXISTS archived_orders; gelingt, wenn die Tabelle fehlt, und entfernt sie, wenn sie vorhanden ist.
impliziter Commit
Ein impliziter Commit schreibt ausstehende Änderungen als automatische Folge einer anderen Anweisung dauerhaft fest, etwa bei gewöhnlicher DDL für dauerhafte Tabellen in MySQL.
Das Erstellen einer Tabelle in MySQL kann ein früheres Update festschreiben, sodass ein späteres Rollback dieses Update nicht rückgängig macht.
IN
Die Prüfung IN prüft, ob ein Wert mit einem Element einer Liste übereinstimmt, darunter auch einer Liste von Schlüsseln aus einer verschachtelten SELECT-Abfrage.
Bestellungen mehrerer Kunden aus Kalifornien können mit Kunden-IDs ausgewählt werden, die eine Unterabfrage zurückgibt.
INSERT
Die Anweisung INSERT fügt einer bestehenden Tabelle Zeilen hinzu. Sie verwendet literale Wertegruppen oder Abfrageergebnisse, die die Regeln des Ziels erfüllen müssen.
Ein Shop fügt ein neues Produkt mit Artikelnummer, Name und Preis ein und lässt dabei die Datenbank seine ID generieren.
INSERT SELECT
Eine INSERT-SELECT-Anweisung kopiert von einer Abfrage zurückgegebene Zeilen in eine bestehende Tabelle und ordnet ausgewählte Spalten anhand ihrer Position den Zielspalten zu.
Der Shop prüft Bestellungen vor 2026 in einer Vorschau und kopiert dann die zurückgegebenen Datensätze in seine bereits definierte Archivtabelle.
INTEGER
Der Typ INTEGER stellt Ganzzahlen dar und eignet sich daher für Anzahlen und exakte Beträge, die als ganze Cent gespeichert werden.
Ein exakter SQLite-Betrag von 19,99 kann für spätere Berechnungen als 1.999 in einer Spalte für ganzzahlige Centbeträge gespeichert werden.
Integritätsbedingung
Eine Integritätsbedingung ist eine deklarierte Datenbankregel, die eingefügte oder aktualisierte Daten prüft und eine Änderung ablehnt, die dagegen verstoßen würde.
Eine Produktpreisprüfung lehnt einen negativen Betrag unabhängig davon ab, welche Anwendung den Schreibvorgang sendet.
IS NULL
Die Prüfung IS NULL wählt fehlende Werte direkt aus, anders als ein gewöhnlicher Gleichheitsvergleich mit NULL, der für einen fehlenden Wert nie wahr ist.
WHERE phone IS NULL findet Kunden ohne Telefonnummer; WHERE phone = NULL findet keine solchen Zeilen.
ISO-Datum
Ein ISO-Datum in der Schreibweise YYYY-MM-DD stellt das Jahr voran, sodass einheitlich formatierter Datumstext zeitlich sortiert werden kann.
SQLite-Textdatumswerte wie '2026-03-15' werden nach Jahr, Monat und Tag sortiert, wenn sie alle dasselbe Format verwenden.

K

Kindtabelle
Eine Kindtabelle enthält einen Fremdschlüssel, der auf eine Elterntabelle verweist und ihre Zeilen mit vorhandenen referenzierten Datensätzen verknüpft.
Die Bestelltabelle ist eine Kindtabelle der Kundentabelle, während Bestellpositionen selbst Kindzeilen von Bestellungen sein können.

L

logisches Löschen
Beim logischen Löschen wird eine gespeicherte Zeile durch einen Wert wie einen Löschzeitstempel als entfernt markiert. Abfragen nach aktiven Zeilen müssen sie ausschließen.
Das Setzen von deleted_at bei einem Kunden erhält die Zeile, sodass Abfragen nach aktiven Kunden deleted_at IS NULL ergänzen.

M

mehrzeiliges INSERT
Ein mehrzeiliges INSERT gibt mehrere Wertegruppen in Klammern in einer Anweisung an, die bei gewöhnlicher Behandlung von Integritätsbedingungen als Ganzes geprüft wird.
Drei Kundenzeilen können mit einer Anweisung hinzugefügt werden; ein gewöhnlicher Verstoß gegen eine Integritätsbedingung in einer Zeile lehnt alle drei ab.

N

natürlicher Schlüssel
Ein natürlicher Schlüssel ist ein Wert aus der realen Welt, der einen Datensatz bereits identifiziert und anstelle einer künstlichen Nummer als Schlüssel dient.
Die ISBN eines Buches kann seine Ausgabe identifizieren, während eine generierte interne Buch-ID ein Surrogatschlüssel wäre.
Neuaufbau einer Tabelle
Der Neuaufbau einer Tabelle erstellt eine Ersatzdefinition, kopiert die vorhandenen Daten, ersetzt die alte Tabelle und stellt abhängige Objekte wieder her.
SQLite kann durch eine Transaktion, die die Tabelle neu aufbaut und die kopierten Zeilen prüft, eine neue Prüfbedingung für eine bestehende Spalte erhalten.
NOT NULL
Eine NOT-NULL-Bedingung schreibt vor, dass der Wert einer Spalte in jeder Zeile vorhanden ist, akzeptiert aber in SQLite und PostgreSQL leeren Text.
Ein bei einer Einfügung ausgelassener Pflichtname für ein Produkt führt zu einem Fehler, wenn er weder einen Standardwert noch einen angegebenen Wert hat.
NULL
NULL ist die SQL-Kennzeichnung für einen fehlenden oder unbekannten Wert und unterscheidet sich sowohl von der Zahl null als auch von einer leeren Zeichenkette.
Ein optionales Telefonfeld verwendet NULL, wenn keine Telefonnummer bekannt ist; IS NULL findet diese Kunden.

O

ON DELETE CASCADE
Die Aktion ON DELETE CASCADE löscht bei einem geprüften Fremdschlüssel automatisch verweisende Kindzeilen, wenn ihre Elternzeile gelöscht wird.
Bei einer Kaskadierung entfernt das Löschen von Kundin Ana ihre Bestellungen 101 und 102, während Kunde Ben und seine Bestellung 103 erhalten bleiben.
ON DELETE SET NULL
Die Aktion ON DELETE SET NULL erhält Kindzeilen nach dem Löschen einer Elternzeile, hebt aber ihre Verknüpfungen auf. Dafür müssen die Verweisspalten NULL zulassen.
Wird ein Lieferant entfernt, können Produkte mit fehlenden Lieferanten-IDs bestehen bleiben, wenn diese Verknüpfung optional ist.
Operatorrangfolge
Die Operatorrangfolge bestimmt, welche Teile eines Ausdrucks zuerst gruppiert werden; SQL wertet AND vor OR aus, sofern Klammern dies nicht ändern.
Werden zwei Statuswerte in Klammern gruppiert, gilt eine gemeinsame Datumsgrenze für beide Zweige der Bedingung.

P

Primärschlüssel
Ein Primärschlüssel ist eine Spalte oder Kombination von Spalten, die eine Zeile eindeutig identifiziert und einen vorhandenen Wert haben muss.
Eine Kunden-ID ermöglicht, mit einem Update einen Kunden zu treffen, auch wenn mehrere Kunden denselben Namen haben.

R

RELEASE
Der Befehl RELEASE entfernt einen Sicherungspunkt, ohne spätere Änderungen rückgängig zu machen oder die äußere Transaktion unabhängig davon festzuschreiben.
Nach der Freigabe eines Sicherungspunkts innerhalb von BEGIN kann ein vollständiges Rollback die ausstehende Transaktionsarbeit weiterhin rückgängig machen.
RETURNING
Eine RETURNING-Klausel lässt einen Schreibvorgang ausgewählte Werte aus betroffenen Zeilen zurückgeben, darunter generierte IDs in PostgreSQL und neueren SQLite-Versionen.
Eine Bestelleinfügung kann ihre neue ID zurückgeben, damit die nächste Einfügung Bestellpositionen mit der tatsächlichen Bestellung verknüpfen kann.
ROLLBACK
Der Befehl ROLLBACK macht ausstehende Änderungen in der aktuellen Transaktion rückgängig und beendet sie, ohne zuvor festgeschriebene Transaktionen zurückzusetzen.
Eine nicht festgeschriebene Löschung, die die Bestelltabelle leert, kann zurückgesetzt werden, um ihre ursprünglichen Zeilen wiederherzustellen.
ROLLBACK TO
Der Befehl ROLLBACK TO macht Änderungen nach einem benannten Sicherungspunkt rückgängig und lässt die äußere Transaktion für weitere Arbeit oder eine endgültige Entscheidung offen.
Das Zurücksetzen auf einen zwischen zwei Kontostandserhöhungen gesetzten Sicherungspunkt namens after_first entfernt die spätere Erhöhung, während die frühere ausstehend bleibt.
ROUND
Die Funktion ROUND fordert eine Rundung auf eine gewählte Anzahl von Dezimalstellen an. Sie ist nützlich, wenn die Speicherung keine Dezimalstellenanzahl durchsetzt.
ROUND(price * 1.10, 2) fordert ein Ergebnis mit zwei Dezimalstellen für eine SQLite-Preisberechnung an, die 21,989 ergeben würde.

S

SET-Zuweisung
Eine SET-Zuweisung nennt innerhalb von UPDATE eine Spalte und ihren neuen Wert oder Ausdruck; Kommas trennen Zuweisungen an mehrere Spalten.
SET in_stock = in_stock - 1 verringert den gespeicherten Bestand, während SET in_stock = 1 ihn durch eins ersetzt.
Sicherungspunkt
Ein Sicherungspunkt ist ein benannter Zwischenpunkt in einer Transaktion, der es erlaubt, spätere Arbeit rückgängig zu machen und frühere ausstehende Änderungen zu erhalten.
Ein Sicherungspunkt nach dem ersten Update erlaubt, das zweite Update rückgängig zu machen, ohne das erste zu verlieren.
Spaltenliste
Die Spaltenliste einer Einfügung nennt die Zielfelder ausdrücklich und bestimmt, wie angegebene Werte ihnen anhand ihrer Position zugeordnet werden.
Die Liste (sku, name, price) macht den ersten angegebenen Wert zu einer Artikelnummer, auch wenn price in der Tabelle früher deklariert wurde.
Staging-Tabelle
Eine Staging-Tabelle enthält importierte Daten vorübergehend, damit sie geprüft und bereinigt werden können, bevor sie in ihr endgültiges Ziel mit Integritätsbedingungen kopiert werden.
Leere importierte E-Mail-Zeichenketten können während der Kopierabfrage durch NULLIF(TRIM(email), '') zu NULL werden.
Surrogatschlüssel
Ein Surrogatschlüssel ist eine künstliche Kennung ohne beschreibende Bedeutung, die oft generiert wird, damit sich Angaben aus der realen Welt unabhängig davon ändern können.
Die generierte ID eines Kunden bleibt nach einer Änderung der E-Mail-Adresse gleich und erhält die Verweise aus Bestellungen.

T

Transaktion
Eine Transaktion fasst Anweisungen zu einer Arbeitseinheit zusammen, deren ausstehende Änderungen gemeinsam mit COMMIT übernommen oder mit ROLLBACK rückgängig gemacht werden können.
Eine Überweisung fasst Abbuchung und Gutschrift in einer Transaktion zusammen, damit eine unvollständige Überweisung rückgängig gemacht werden kann.
TRUNCATE
Die Anweisung TRUNCATE leert eine ganze Tabelle ohne WHERE-Filter in Datenbanken, die sie unterstützen; SQLite stellt sie nicht bereit.
Eine PostgreSQL-Tabelle kann mit TRUNCATE TABLE geleert werden, aber ihre Abhängigkeits- und Transaktionsregeln sind weiterhin wichtig.
Typaffinität
Die Typaffinität ist die Präferenz von SQLite für den Speichertyp einer Spalte. Sie kann geeignete Eingaben umwandeln, ohne jede andere Art abzulehnen.
Eine gewöhnliche SQLite-Ganzzahlspalte wandelt '5' in 5 um, kann aber 'abc' ohne Fehler als Text behalten.

U

UNIQUE
Eine UNIQUE-Bedingung verhindert wiederholte vorhandene Werte oder Wertekombinationen; das Verhalten bei fehlenden Werten hängt von der Datenbank ab.
UNIQUE (order_id, product_id) erlaubt dasselbe Produkt in verschiedenen Bestellungen, lehnt aber ein wiederholtes Paar ab.
Unterabfrage
Eine Unterabfrage ist ein in eine andere Anweisung verschachteltes SELECT, das Werte oder Zeilen zur Verwendung durch die umgebende Anweisung liefert.
Eine Löschung kann order_id IN (SELECT id FROM orders WHERE status = 'cancelled') verwenden, um zugehörige Positionen auszuwählen.
UPDATE
Die Anweisung UPDATE weist Spalten in bestehenden Zeilen neue Werte zu und wählt ihre Zielzeilen mit einer optionalen WHERE-Bedingung aus.
UPDATE products SET price = 22.50 WHERE id = 3; ändert ein Produkt, ohne eine neue Produktzeile einzufügen.
Upsert
Ein Upsert versucht, eine Zeile einzufügen, und kann eine vorhandene Zeile aktualisieren, wenn ein Schlüssel oder eindeutiger Wert mit den vorgesehenen neuen Daten kollidiert.
Ein Lagerbestandsimport kann eine neue Artikelnummer hinzufügen oder ihren Bestand mit ON CONFLICT (sku) DO UPDATE aktualisieren, wenn sie existiert.

W

WHERE-Bedingung
Eine WHERE-Bedingung prüft jede Zeile, um sie für eine Abfrage oder einen Schreibvorgang auszuwählen; nur Zeilen, für die die Bedingung wahr ist, werden ausgewählt.
Ein nach dem Primärschlüssel des Produkts gefiltertes Update erreicht höchstens eine Zeile, auch wenn sich Produktnamen wiederholen.

Z

Zeichenkettenliteral
Ein Zeichenkettenliteral ist Text, der in SQL als Wert in einfachen Anführungszeichen geschrieben wird. Innere Apostrophe werden verdoppelt, damit sie im Text bleiben.
Das SQL-Literal 'O''Brien' speichert den Namen „O'Brien“ mit einem Apostroph, statt den Wert vorzeitig zu beenden.
zusammengesetzter Schlüssel
Ein zusammengesetzter Schlüssel identifiziert eine Zeile durch die Kombination mehrerer Spaltenwerte, ohne dass jede Spalte für sich eindeutig sein muss.
Das Paar aus Bestell-ID und Produkt-ID identifiziert eine Bestellposition und erlaubt zugleich beide Werte in anderen Paaren.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten