PostgreSQL – Upsert

La declaración UPSERT es una característica de DBMS que permite al autor de una declaración DML insertar una fila o, si la fila ya existe, ACTUALIZAR esa fila existente. Es por eso que la acción se conoce como UPSERT (simplemente una combinación de Actualizar e Insertar). Para lograr la funcionalidad de UPSERT, PostgreSQL usa la instrucción INSERT ON CONFLICT.

Sintaxis:

INSERT INTO table_name(column_list)  
VALUES(value_list)
ON CONFLICT target action;

Si analizamos la sintaxis anterior:

  • El objetivo puede ser:
  1. (column_name) – cualquier nombre de columna.
  2. ON CONSTRAINT nombre_restricción : donde el nombre de la restricción podría ser el nombre de la restricción ÚNICA.
  3.  Predicado WHERE  : una cláusula WHERE con una condición booleana.
  • La acción puede ser:
  1. NO HACER NADA : si la fila ya existe en la tabla, no haga nada.
  2. ACTUALIZAR SET columnaA = valorA, …. DONDE condición : actualice algunos campos en la tabla dependiendo de la condición.
     

Primero, creamos una tabla de muestra usando los siguientes comandos para realizar ejemplos:

CREATE TABLE employees (
 employee_id serial PRIMARY KEY,
 full_name VARCHAR NOT NULL,
 manager_id INT
);

Luego insertamos datos en nuestra tabla de empleados de la siguiente manera:

INSERT INTO employees (
 employee_id,
 full_name,
 manager_id
)
VALUES
 (1, 'M.S Dhoni', NULL),
 (2, 'Sachin Tendulkar', 1),
 (3, 'R. Sharma', 1),
 (4, 'S. Raina', 1),
 (5, 'B. Kumar', 1),
 (6, 'Y. Singh', 2),
 (7, 'Virender Sehwag ', 2),
 (8, 'Ajinkya Rahane', 2),
 (9, 'Shikhar Dhawan', 2),
 (10, 'Mohammed Shami', 3),
 (11, 'Shreyas Iyer', 3),
 (12, 'Mayank Agarwal', 3),
 (13, 'K. L. Rahul', 3),
 (14, 'Hardik Pandya', 4),
 (15, 'Dinesh Karthik', 4),
 (16, 'Jasprit Bumrah', 7),
 (17, 'Kuldeep Yadav', 7),
 (18, 'Yuzvendra Chahal', 8),
 (19, 'Rishabh Pant', 8),
 (20, 'Sanju Samson', 8);

La mesa es:

Ejemplo 1:

La siguiente consulta se utiliza para cambiar el nombre de employee_id 6 (si existe dicho empleado) de Y. Singh a Yuvraj Singh o insertar el registro si dicho empleado no existe.

insert into employees(employee_id,full_name)
values(6,'Yuvraj Singh')
on conflict(employee_id)
do
update set full_name=EXCLUDED.full_name; 

Para verificar los cambios en la tabla, usamos la siguiente consulta:

select * from employees;

Producción:

En este ejemplo, intentamos usar la cláusula UPDATE como la acción de la declaración INSERT para actualizar el nombre del empleado con ID 6 si el empleado existe. 

Ejemplo 2:

La siguiente consulta se usa para insertar un empleado con identificación de empleado 18 con el nombre ‘W. Sundar’ y la identificación del administrador ‘6’ (si no existe ningún registro), pero no haga nada, en caso de que dicho registro ya esté presente en la tabla.  

insert into employees(employee_id,full_name,manager_id)
values(18,'W. Sundar',6)
on conflict (employee_id)
do nothing;

Para verificar los cambios en la tabla, usamos la siguiente consulta:

select * from employees;

Producción:

En este ejemplo, no se cambió nada en la tabla porque el empleado con id. de empleado 18 ya existe y la acción es no hacer nada. 

Ejemplo 3:

La siguiente consulta se utiliza para insertar un empleado con identificación de empleado 21 con el nombre ‘W. Sundar’ y la identificación del administrador ‘6’ (si no existe ningún registro), pero no haga nada, en caso de que dicho registro ya esté presente en la tabla. 

insert into employees(employee_id,full_name,manager_id)
values(21,'W. Sundar',6)
on conflict (employee_id)
do nothing; 

Para verificar los cambios en la tabla, usamos la siguiente consulta:

select * from employees;

Producción:

En este ejemplo, se insertó un nuevo registro en la tabla ya que no había ningún empleado existente en la tabla con la identificación de empleado 21. 

Publicación traducida automáticamente

Artículo escrito por ashutoshrathi y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *