PostgreSQL einfügen oder aktualisieren, falls vorhanden
- Verwenden Sie die Unterabfrage, um eine Zeile einzufügen oder zu aktualisieren, falls vorhanden
-
Verwenden Sie
UPSERT
, um eine Zeile einzufügen oder zu aktualisieren, falls vorhanden
Es gibt zwei Möglichkeiten, eine Einfügung oder Aktualisierung durchzuführen, falls vorhanden. Wir können die Unterabfrage verwenden, um zu prüfen, ob die Zeile in der Tabelle vorhanden ist.
Eine andere Methode ist die UPSERT
-Methode.
Verwenden Sie die Unterabfrage, um eine Zeile einzufügen oder zu aktualisieren, falls vorhanden
Nehmen wir an, wir haben eine Tabelle wie die folgende, in der die id
der Primärschlüssel ist.
postgres=# select * from users;
id | name | gender | age
----+--------------------+------------+-----
1 | Tymothy Blezard | Polygender | 21
2 | Carlynne Renak | Female | 30
3 | Hewitt Mylechreest | Male | 26
4 | Griswold Geer | Male | 30
5 | Kelley Vines | Female | 22
6 | Ted Haizelden | Male | 27
7 | Bonita Glewe | Female | 27
8 | Edgar Hambers | Male | 22
9 | Johnathan Dwelley | Male | 22
10 | Fritz Rylance | Male | 22
(10 rows)
Lassen Sie uns eine neue Zeile wie die folgende hinzufügen:
postgres=# Update Users set name='Tymothy', gender='Male', age=21 WHERE id=1;
UPDATE 1
postgres=# select * from users order by id;
id | name | gender | age
----+--------------------+--------+-----
1 | Tymothy | Male | 21
2 | Carlynne Renak | Female | 30
3 | Hewitt Mylechreest | Male | 26
.
.
Jetzt können wir sehen, dass die Zeile erfolgreich mit einer id
gleich 1
aktualisiert wurde. Aber UPDATE 0
tritt auf, wenn wir eine Zeile mit der id
gleich 11
oder einer anderen id
aktualisieren wollen, die nicht in der Tabelle vorhanden ist.
postgres=# Update Users set name='Tymothy', gender='Male', age=21 WHERE id=11;
UPDATE 0
Lassen Sie uns eine Unterabfrage erstellen, die die Zeile einfügt, wenn sie nicht in der Tabelle vorhanden ist. Wir wollen zum Beispiel diese Update
-Operation durchführen:
Update Users set name='John Kane', gender='Male', age=21 WHERE id=12;
Unsere Lösung wird also sein:
UPDATE Users set name='John Kane', gender='Male', age=21 WHERE id=12;
INSERT INTO Users (id,name,gender,age)
SELECT 12,'John kane','Male',21
WHERE NOT EXISTS (SELECT 1 from Users WHERE id=12);
Hier ist die Ausgabe:
postgres=# select * from users order by id desc;
id | name | gender | age
----+--------------------+--------+-----
12 | John kane | Male | 21
10 | Fritz Rylance | Male | 22
Verwenden Sie UPSERT
, um eine Zeile einzufügen oder zu aktualisieren, falls vorhanden
Hier ist die allgemeine Methode zur Verwendung von upsert.
INSERT INTO customers (name, email)
VALUES('field1_value','field2_value')
ON CONFLICT (unique_field)
DO
UPDATE SET field2 = "new_field_value";
Versuchen wir für unseren Fall, das Alter zu aktualisieren, das die id
von 13
hat. Die Abfrage sieht also wie folgt aus:
INSERT INTO users (id,name, gender,age)
VALUES(12,'John kane','Male',23)
ON CONFLICT (id)
DO
UPDATE SET age = 24;
postgres=# select * from users order by id desc;
id | name | gender | age
----+--------------------+------------+-----
12 | John Kane | Male | 24
10 | Fritz Rylance | Male | 22
9 | Johnathan Dwelley | Male | 22
Sie können also sehen, dass es aktualisiert wurde, weil UPSERT
einen Konflikt mit der angegebenen ID gefunden hat. Es wird die Operation INSERT
ausführen, wenn es keinen Konflikt findet.
Um mehr über die UPSERT
-Operation zu erfahren, besuchen Sie die folgende offizielle Dokumentation.