PostgreSQL einfügen oder aktualisieren, falls vorhanden

Shihab Sikder 20 Juni 2023
  1. Verwenden Sie die Unterabfrage, um eine Zeile einzufügen oder zu aktualisieren, falls vorhanden
  2. Verwenden Sie UPSERT, um eine Zeile einzufügen oder zu aktualisieren, falls vorhanden
PostgreSQL einfügen oder 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.

Shihab Sikder avatar Shihab Sikder avatar

I'm Shihab Sikder, a professional Backend Developer with experience in problem-solving and content writing. Building secure, scalable, and reliable backend architecture is my motive. I'm working with two companies as a part-time backend engineer.

LinkedIn Website