SQL UPSERT: различные методы эффективного управления данными

В сфере управления базами данных термин «UPSERT» относится к комбинации операций INSERT и UPDATE. UPSERT позволяет вставить новую строку в таблицу, если она не существует, или обновить существующую строку, если она существует. В этой статье будут рассмотрены несколько методов выполнения операций UPSERT в SQL, а также приведены примеры кода для каждого метода.

Метод 1: использование INSERT INTO… ON CONFLICT DO UPDATE
Этот метод подходит для баз данных, поддерживающих предложение «ON CONFLICT». Он предоставляет краткий способ указать действие по разрешению конфликта.

INSERT INTO table_name (column1, column2)
VALUES (value1, value2)
ON CONFLICT (unique_column)
DO UPDATE SET column1 = new_value1, column2 = new_value2;

Метод 2: использование оператора MERGE (SQL Server, Oracle и PostgreSQL)
Инструкция MERGE объединяет операции INSERT, UPDATE и DELETE в одном операторе, что делает его мощным инструментом для операций UPSERT.

MERGE INTO table_name AS target
USING (SELECT value1, value2 FROM dual) AS source
ON (target.unique_column = source.unique_column)
WHEN MATCHED THEN
  UPDATE SET target.column1 = source.new_value1, target.column2 = source.new_value2
WHEN NOT MATCHED THEN
  INSERT (column1, column2) VALUES (source.value1, source.value2);

Метод 3: использование INSERT INTO… SELECT… WHERE NOT EXISTS (MySQL и SQLite)
Этот метод использует комбинацию операторов INSERT INTO и SELECT для достижения функциональности UPSERT.

INSERT INTO table_name (column1, column2)
SELECT value1, value2
FROM dual
WHERE NOT EXISTS (
  SELECT 1 FROM table_name
  WHERE unique_column = target.unique_column
);

Метод 4. Использование условных операторов (PL/SQL).
В PL/SQL вы можете использовать условные операторы, чтобы проверить, существует ли строка, перед выполнением операции INSERT или UPDATE.

DECLARE
  row_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO row_count
  FROM table_name
  WHERE unique_column = target.unique_column;
  IF row_count > 0 THEN
    UPDATE table_name
    SET column1 = new_value1, column2 = new_value2
    WHERE unique_column = target.unique_column;
  ELSE
    INSERT INTO table_name (column1, column2)
    VALUES (value1, value2);
  END IF;
END;

Эффективное управление данными в базах данных SQL часто требует выполнения операций UPSERT. В этой статье мы рассмотрели различные методы реализации функциональности UPSERT в SQL, включая использование определенных предложений SQL, таких как ON CONFLICT, операторы MERGE, INSERT INTO SELECT WHERE NOT EXISTS и условные операторы в PL/SQL. Используя эти методы, вы можете эффективно обрабатывать сценарии манипулирования данными, которые включают вставку или обновление записей в вашей базе данных.

Не забудьте выбрать метод, соответствующий технологии и синтаксису вашей базы данных. Каждый метод имеет свои преимущества и может быть более подходящим для конкретных случаев использования. Освоение операций UPSERT повысит ваши способности эффективно управлять данными.