Insertar o actualizar PostgreSQL si existe

Shihab Sikder 20 junio 2023
  1. Usar subconsulta para insertar o actualizar fila si existe
  2. Use UPSERT para insertar o actualizar la fila si existe
Insertar o actualizar PostgreSQL si existe

Hay dos formas de realizar una inserción o actualización, si existen. Podemos usar la subconsulta para verificar si la fila está presente en la tabla.

Otro método es que podemos usar el método UPSERT.

Usar subconsulta para insertar o actualizar fila si existe

Supongamos que tenemos una tabla como la siguiente, donde el id es la clave principal.

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)

Agreguemos una nueva fila como la siguiente:

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
  .
  .

Ahora, podemos ver que actualizó con éxito la fila con un id igual a 1. Pero se producirá UPDATE 0 si queremos actualizar una fila con el id igual a 11 u otro id que no está presente en la tabla.

postgres=# Update Users set name='Tymothy', gender='Male', age=21 WHERE id=11;
UPDATE 0

Vamos a crear una subconsulta que insertará la fila si no está presente en la tabla. Por ejemplo, queremos realizar esta operación de Actualización:

Update Users set name='John Kane', gender='Male', age=21 WHERE id=12;

Entonces, nuestra solución será:

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);

Aquí está la salida:

postgres=# select * from users order by id desc;
 id |        name        | gender | age
----+--------------------+--------+-----
 12 | John kane          | Male   |  21
 10 | Fritz Rylance      | Male   |  22

Use UPSERT para insertar o actualizar la fila si existe

Esta es la forma general de usar upsert.

INSERT INTO customers (name, email)
VALUES('field1_value','field2_value')
ON CONFLICT (unique_field)
DO
  UPDATE SET field2 = "new_field_value";

Para nuestro caso, intentemos actualizar la edad de quienes tienen el id de 13. Entonces, la consulta será como la siguiente:

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

Entonces, puede ver que está actualizado porque UPSERT encontró un conflicto con la identificación dada. Realizará la operación INSERTAR si no encuentra ningún conflicto.

Para saber más sobre la operación UPSERT, visita la siguiente documentación oficial.

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