Daten ändern: INSERT, UPDATE, DELETE

INSERT, UPDATE und DELETE verändern gespeicherte Daten. Neben der Syntax geht es darum, betroffene Zeilen zu prüfen und Änderungen bei Bedarf zurückzunehmen.

Diese Lektion ändert Daten. Sie ändert Ihre Kopie: Die Beispieldatenbank ist in Ihren Browser geladen und verlässt ihn nie, alles hier lässt sich also gefahrlos ausführen und gefahrlos falsch machen. Laden Sie das Beispiel über den Willkommensbildschirm neu, um von vorn zu beginnen.

INSERT

Nennen Sie die Spalten und geben Sie je einen Wert an. Weggelassene Spalten bekommen ihren Standardwert – added_at steht hier standardmäßig auf dem aktuellen Zeitstempel.

1

INSERT INTO wishlists (customer_id, product_id)
VALUES (1, 288);
In Planche ausführen

1 Zeile geändert

Öffnet Planche in einem eigenen Browser-Tab, mit geladener Beispieldatenbank und dieser Abfrage im Editor. Alle Beispiele der Seite verwenden denselben Tab weiter, und ausgeführt wird erst, wenn Sie F9 drücken.

Eine Zeile geändert. Die Spalten ausdrücklich zu nennen, statt sich auf die Spaltenreihenfolge der Tabelle zu verlassen, sorgt dafür, dass die Anweisung auch dann noch funktioniert, wenn jemand eine Spalte hinzufügt.

Was die Datenbank ablehnt

Führen Sie exakt dieselbe Anweisung noch einmal aus.

2

-- The same statement a second time. (customer_id, product_id) is the
-- primary key of wishlists, so the database refuses the duplicate.
INSERT INTO wishlists (customer_id, product_id)
VALUES (1, 288);
In Planche ausführen

Fehler

UNIQUE constraint failed: wishlists.customer_id, wishlists.product_id

Ein Fehler, und nichts hat sich geändert. wishlists hat PRIMARY KEY (customer_id, product_id), dasselbe Paar kann also nicht zweimal existieren – die Bedingung hat es abgelehnt. Constraints sind keine Hindernisse, die man umgeht; sie verhindern, dass ein Fehler in Ihrer Anwendung zu dauerhaft falschen Daten wird.

UPDATE und die Klausel, auf die es ankommt

3

UPDATE customers
SET loyalty_points = loyalty_points + 100
WHERE id = 1;
In Planche ausführen

1 Zeile geändert

Zwei Gewohnheiten machen das deutlich unwahrscheinlicher. Die erste: die WHERE-Klausel vor der SET-Klausel schreiben. Die zweite: sie erst als SELECT ausführen – dasselbe FROM, dasselbe WHERE – und ansehen, was zurückkommt, bevor etwas geändert wird.

Das Zweite kann Planche für Sie übernehmen. Schalten Sie Einstellungen › Sicherheit › Betroffene Zeilen vorab anzeigen ein, und ein UPDATE oder DELETE wird in das passende SELECT umgeschrieben, gezählt und Ihnen vor der Ausführung gezeigt. Eine schreibgeschützte Verbindung und eine Farbe je Verbindung für die Produktion finden Sie an derselben Stelle.

4

SELECT id, first_name, last_name, loyalty_points
FROM customers
WHERE id = 1;
In Planche ausführen

Ergebnis — 1 Zeile

idfirst_namelast_nameloyalty_points
1LiamFischer3619

DELETE

5

DELETE FROM wishlists
WHERE customer_id = 1
  AND product_id = 288;
In Planche ausführen

1 Zeile geändert

Die Zeilen mit einer Unterabfrage auswählen

Die WHERE-Klausel eines UPDATE oder DELETE ist eine gewöhnliche WHERE-Klausel, alles aus der Lektion zu Unterabfragen funktioniert hier also. Über eine Unterabfrage ändern Sie Zeilen einer Tabelle anhand dessen, was in einer anderen steht.

6

-- Which rows to change is its own question, and a subquery can answer it.
UPDATE customers
SET loyalty_points = loyalty_points + 50
WHERE id IN (
  SELECT customer_id
  FROM orders
  WHERE status = 'refunded'
    AND total > 2000
);
In Planche ausführen

242 Zeilen geändert

242 Kunden hatten eine erstattete Bestellung über 2.000, und diese 242 Zeilen haben sich geändert. Die Gewohnheit von vorhin gilt genauso: Führen Sie es zuerst als SELECT id FROM customers WHERE id IN (...) aus und zählen Sie die Zeilen, denn in der Unterabfrage steckt der Fehler.

7

DELETE FROM wishlists
WHERE product_id IN (
  SELECT id FROM products WHERE stock_quantity = 0
);
In Planche ausführen

260 Zeilen geändert

NOT EXISTS und EXISTS funktionieren hier ebenfalls und sind für den verneinten Fall aus dem in der Unterabfragen-Lektion genannten Grund die sicherere Wahl. Nicht portabel ist dagegen, direkt in einem UPDATE oder DELETE zu joinen – jede Engine schreibt das anders, und eine kann es gar nicht. Die Dialektseite dazu behandelt alle fünf.

Transaktionen

Eine Transaktion gruppiert Anweisungen so, dass alle oder keine passieren – und lässt Sie bis zum Bestätigen das Ergebnis ansehen und es sich anders überlegen.

8

BEGIN;

UPDATE coupons
SET used_count = used_count + 1
WHERE code = 'WELCOME10';

SELECT code, used_count FROM coupons WHERE code = 'WELCOME10';

ROLLBACK;
In Planche ausführen

Ergebnis — 1 Zeile

codeused_count
WELCOME1063

BEGIN öffnet sie, das SELECT zeigt den Gutschein bereits erhöht, und ROLLBACK setzt es zurück. Tauschen Sie ROLLBACK gegen COMMIT, und die Änderung wird stattdessen dauerhaft. Überzeugen Sie sich selbst, dass die Anzahl unverändert ist:

9

SELECT code, used_count FROM coupons WHERE code = 'WELCOME10';
In Planche ausführen

Ergebnis — 1 Zeile

codeused_count
WELCOME1062

Für eine riskante Änderung an einer echten Datenbank ist das das richtige Werkzeug: Transaktion öffnen, Anweisung ausführen, prüfen, ob die Zeilenzahl den Erwartungen entspricht, und erst dann bestätigen. Planche hat das als Modus – Verbindung › Manuelle Transaktionen hält eine Transaktion offen und legt Commit und Rollback in die Werkzeugleiste, sodass jede ausgeführte Anweisung vorläufig bleibt, bis Sie sich festlegen.

Was Sie jetzt können

Alles, außer herauszufinden, warum eine Abfrage langsam ist – und das ist die letzte Lektion.

Selbst ausprobieren

  1. Nehmen Sie jedes nicht vorrätige Produkt aus dem Verkauf. Prüfen Sie vor dem Ausführen, wie viele Zeilen Sie erwarten.

    Lösung anzeigen

    Lösung anzeigen

    UPDATE products
    SET is_active = 0
    WHERE stock_quantity = 0;
    In Planche ausführen

    40 Zeilen geändert

    40 Zeilen. Zuerst SELECT COUNT(*) FROM products WHERE stock_quantity = 0 auszuführen ist die ganze Gewohnheit: Sie kennen die Zahl vor der Anweisung, eine unerwartete Anzahl ist damit eine Warnung und keine Entdeckung.

  2. Löschen Sie Benachrichtigungen, die gelesen und älter als 2025 sind.

    Lösung anzeigen

    Lösung anzeigen

    DELETE FROM notifications
    WHERE is_read = 1
      AND created_at < '2025-01-01';
    In Planche ausführen

    1202 Zeilen geändert

    1.202 Zeilen. Beide Bedingungen zählen – ohne is_read = 1 würden auch ungelesene Benachrichtigungen verschwinden, und das hier ist ein DELETE: Es gibt nichts rückgängig zu machen, sofern Sie nicht vorher eine Transaktion geöffnet haben.