Основы UPSERT в SQL

Команда UPSERT в SQL (также известная как "insert or update") объединяет операции вставки и обновления в одном запросе. Она позволяет вставить новую запись в таблицу или обновить существующую запись, если она уже присутствует. Это полезно для обработки данных, когда не всегда можно заранее определить, существует ли запись.

Основные подходы к UPSERT

Синтаксис в PostgreSQL

В PostgreSQL для выполнения операции UPSERT используется команда INSERT ... ON CONFLICT.

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON CONFLICT (conflict_column)
DO UPDATE SET column1 = value1, column2 = value2;

Пример:

INSERT INTO employees (employee_id, name, salary)
VALUES (1, 'John Doe', 75000)
ON CONFLICT (employee_id)
DO UPDATE SET name = EXCLUDED.name, salary = EXCLUDED.salary;

В этом примере, если запись с employee_id = 1 уже существует, то ее name и salary будут обновлены на новые значения. Если записи с таким employee_id нет, то будет вставлена новая запись.

Синтаксис в MySQL

В MySQL для выполнения UPSERT используется команда INSERT ... ON DUPLICATE KEY UPDATE.

INSERT INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...)
ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2;

Пример:

INSERT INTO employees (employee_id, name, salary)
VALUES (1, 'John Doe', 75000)
ON DUPLICATE KEY UPDATE name = VALUES(name), salary = VALUES(salary);

Здесь, если запись с employee_id = 1 уже существует, она будет обновлена с новыми значениями name и salary. Если записи с таким employee_id нет, то будет вставлена новая запись.

Синтаксис в SQLite

В SQLite также поддерживается команда INSERT OR REPLACE, которая выполняет операцию UPSERT.

INSERT OR REPLACE INTO table_name (column1, column2, ...)
VALUES (value1, value2, ...);

Пример:

INSERT OR REPLACE INTO employees (employee_id, name, salary)
VALUES (1, 'John Doe', 75000);

Если запись с employee_id = 1 существует, она будет заменена новыми значениями. Если нет, будет вставлена новая запись.

Синтаксис в SQL Server

В SQL Server для UPSERT используется конструкция MERGE.

MERGE INTO target_table AS target
USING source_table AS source
ON target.key_column = source.key_column
WHEN MATCHED THEN
    UPDATE SET target.column1 = source.column1, target.column2 = source.column2
WHEN NOT MATCHED THEN
    INSERT (column1, column2)
    VALUES (source.column1, source.column2);

В этом примере MERGE сопоставляет записи из source_table с target_table и выполняет обновление или вставку в зависимости от результата сопоставления.

Особенности

  • Индексы и ключи: Для успешного выполнения UPSERT важно наличие уникальных индексов или ключей, которые позволяют определить, существует ли запись.

  • Производительность: Команда UPSERT может иметь разную производительность в зависимости от используемой СУБД и объема данных.

Команда UPSERT значительно упрощает работу с данными, позволяя автоматически обрабатывать случаи вставки и обновления в одном запросе.

Last updated