В сфере управления базами данных термин «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 повысит ваши способности эффективно управлять данными.