Операции UPSERT: определение и применение

Операции UPSERT, также известные как "update or insert", позволяют выполнять вставку новой записи в базу данных или обновление существующей записи, если она уже существует. Это полезно для обеспечения целостности данных, предотвращения дублирования и упрощения логики работы с базой данных. Разные системы управления базами данных (СУБД) реализуют операции UPSERT по-разному.

Определение UPSERT

  • Upsert (сокращение от "update or insert") — это операция, которая позволяет вставить запись в таблицу, если такая запись отсутствует, или обновить существующую запись, если она уже существует. Это объединение операций INSERT и UPDATE в одну команду.

Применение UPSERT

Операции UPSERT часто применяются в ситуациях, когда:

  1. Синхронизация данных: Обновление существующих записей и вставка новых, чтобы поддерживать актуальные данные.

  2. Импорт данных: Загрузка данных из внешних источников, где необходимо обновить существующие записи и добавить новые.

  3. Обработка транзакций: Обработка данных, где необходимо обеспечить целостность и избежать дублирования.

Примеры реализации UPSERT в различных СУБД

1. PostgreSQL

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

-- Создание таблицы
CREATE TABLE employees (
    employee_id SERIAL PRIMARY KEY,
    name TEXT,
    salary DECIMAL(10, 2)
);

-- UPSERT операция
INSERT INTO employees (employee_id, name, salary)
VALUES (1, 'John Doe', 60000)
ON CONFLICT (employee_id)
DO UPDATE SET
    name = EXCLUDED.name,
    salary = EXCLUDED.salary;

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

2. MySQL

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

-- Создание таблицы
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name VARCHAR(100),
    salary DECIMAL(10, 2)
);

-- UPSERT операция
INSERT INTO employees (employee_id, name, salary)
VALUES (1, 'John Doe', 60000)
ON DUPLICATE KEY UPDATE
    name = VALUES(name),
    salary = VALUES(salary);

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

3. SQL Server

В SQL Server для выполнения UPSERT можно использовать команду MERGE.

-- Создание таблицы
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    name NVARCHAR(100),
    salary DECIMAL(10, 2)
);

-- UPSERT операция с использованием MERGE
MERGE INTO employees AS target
USING (VALUES (1, 'John Doe', 60000)) AS source (employee_id, name, salary)
ON target.employee_id = source.employee_id
WHEN MATCHED THEN
    UPDATE SET name = source.name, salary = source.salary
WHEN NOT MATCHED THEN
    INSERT (employee_id, name, salary)
    VALUES (source.employee_id, source.name, source.salary);

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

4. Oracle

В Oracle также используется команда MERGE для выполнения UPSERT.

-- Создание таблицы
CREATE TABLE employees (
    employee_id NUMBER PRIMARY KEY,
    name VARCHAR2(100),
    salary NUMBER
);

-- UPSERT операция с использованием MERGE
MERGE INTO employees target
USING (SELECT 1 AS employee_id, 'John Doe' AS name, 60000 AS salary FROM dual) source
ON (target.employee_id = source.employee_id)
WHEN MATCHED THEN
    UPDATE SET name = source.name, salary = source.salary
WHEN NOT MATCHED THEN
    INSERT (employee_id, name, salary)
    VALUES (source.employee_id, source.name, source.salary);

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

Заключение

Операции UPSERT позволяют эффективно управлять данными в базе данных, объединяя вставку и обновление в одну команду. Это упрощает работу с данными и обеспечивает целостность информации. Методы выполнения UPSERT зависят от используемой СУБД:

  • PostgreSQL: INSERT ... ON CONFLICT

  • MySQL: INSERT ... ON DUPLICATE KEY UPDATE

  • SQL Server: MERGE

  • Oracle: MERGE

Эти методы помогают минимизировать количество запросов и обработку данных, обеспечивая актуальность и целостность записей.

Last updated