Insertar o actualizar PostgreSQL si existe
- Usar subconsulta para insertar o actualizar fila si existe
-
Use
UPSERT
para insertar o actualizar la fila 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.