Zum Inhalt springen

UPDATE-Anweisung

Die UPDATE-Anweisung ändert die Werte von Zeilen in einer Tabelle.

Beispiele

Für jede Zeile, in der i NULL ist, den Wert stattdessen auf 0 setzen:

UPDATE tbl
SET i = 0
WHERE i IS NULL;

Alle Werte von i auf 1 und alle Werte von j auf 2 setzen:

UPDATE tbl
SET i = 1, j = 2;

Syntax

UPDATE ändert die Werte der angegebenen Spalten in allen Zeilen, die die Bedingung erfüllen. Nur die zu ändernden Spalten müssen in der SET-Klausel genannt werden; nicht explizit geänderte Spalten behalten ihre bisherigen Werte.

Update aus einer anderen Tabelle

Eine Tabelle kann anhand von Werten aus einer anderen Tabelle aktualisiert werden. Das kann durch Angabe einer Tabelle in einer FROM-Klausel oder durch eine Unterabfrage geschehen. Beide Ansätze haben den Vorteil, dass die UPDATE-Operation in Bulk ausgeführt wird und so die Performance steigt.

CREATE OR REPLACE TABLE original AS
SELECT 1 AS key, 'original value' AS value
UNION ALL
SELECT 2 AS key, 'original value 2' AS value;
CREATE OR REPLACE TABLE new AS
SELECT 1 AS key, 'new value' AS value
UNION ALL
SELECT 2 AS key, 'new value 2' AS value;
SELECT *
FROM original;
key value
1 original value
2 original value 2
UPDATE original
SET value = new.value
FROM new
WHERE original.key = new.key;

Oder:

UPDATE original
SET value = (
SELECT
new.value
FROM new
WHERE original.key = new.key
);
SELECT *
FROM original;
key value
1 new value
2 new value 2

Update aus derselben Tabelle

Der einzige Unterschied zu dem obigen Fall ist, dass sowohl für die Ziel- als auch für die Quelltabelle ein anderer Tabellenalias angegeben werden muss. In diesem Beispiel sind AS true_original und AS new beide erforderlich.

UPDATE original AS true_original
SET value = (
SELECT
new.value || ' a change!' AS value
FROM original AS new
WHERE true_original.key = new.key
);

Update mit Joins

Um die zu aktualisierenden Zeilen auszuwählen, können UPDATE-Anweisungen die FROM-Klausel nutzen und Joins über die WHERE-Klausel ausdrücken. Zum Beispiel:

CREATE TABLE city (name VARCHAR, revenue BIGINT, country_code VARCHAR);
CREATE TABLE country (code VARCHAR, name VARCHAR);
INSERT INTO city VALUES ('Paris', 700, 'FR'), ('Lyon', 200, 'FR'), ('Brussels', 400, 'BE');
INSERT INTO country VALUES ('FR', 'France'), ('BE', 'Belgium');

Um den Umsatz aller Städte in Frankreich zu erhöhen, joinen Sie die Tabellen city und country und filtern auf Letztere:

UPDATE city
SET revenue = revenue + 100
FROM country
WHERE city.country_code = country.code
AND country.name = 'France';
SELECT *
FROM city;
name revenue country_code
Paris 800 FR
Lyon 300 FR
Brussels 400 BE

Upsert (Insert oder Update)

Details finden Sie in der Insert-Dokumentation.