Введение
Оператор SQL
Реляционная система управления базами данных использует операторы SQL (также называемые upsert) для ВСТАВКИ новых записей или ОБНОВЛЕНИЯ существующих записей в зависимости от соответствия условию. Он был официально представлен в стандарте SQL:2003 и расширен в стандарте SQL:2008.
A relational database management system uses SQL (also called upsert) statements to INSERT new records or UPDATE existing records depending on whether condition matches. It was officially introduced in the SQL:2003 standard, and expanded in the SQL:2008 standard.
Реализация
Системы управления базами данных PostgreSQL, Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, Vectorwise и Apache Derby поддерживают стандартный синтаксис. Некоторые из них также добавляют нестандартные расширения SQL.
Синоним
Некоторые реализации баз данных приняли термин "Upsert" (комбинация слов "update" и "insert") для обозначения инструкции базы данных или набора инструкций, которые вставляют запись в таблицу, если она не существует, или обновляют существующую запись, если она уже есть. Этот синоним используется в PostgreSQL (v9.5+) и SQLite (v3.24+). Он также применяется для сокращенного обозначения эквивалентного псевдокода "MERGE" и используется в Microsoft Azure SQL Database.
Другие нестандартные варианты реализации
Некоторые другие системы управления базами данных поддерживают это или очень похожее поведение через свои собственные нестандартные расширения SQL. Например, MySQL поддерживает использование синтаксиса, который может быть использован для достижения аналогичного эффекта с ограничением, что соединение между целевой и исходной таблицами должно быть выполнено только по PRIMARY KEY или UNIQUE ограничениям, что не требуется в стандарте ANSI/ISO. Он также поддерживает синтаксис, который сначала пытается выполнить вставку, и если это не удается, удаляет строку, если она существует, а затем вставляет новую. Существует также предложение для оператора, которое предписывает серверу игнорировать ошибки "дублирующегося ключа" и продолжать работу (существующие строки не будут вставлены или обновлены, но все новые строки будут вставлены). SQLite работает аналогично. Он также поддерживает как псевдоним для совместимости с MySQL. Firebird поддерживает, но не выдает ошибку при наличии нескольких строк данных-источников. Кроме того, существует версия для одной строки, , но последняя не предоставляет возможности выполнять различные действия при вставке и обновлении (например, устанавливать новое значение последовательности только для новых строк, а не для существующих). IBM Db2 расширяет синтаксис несколькими и предложениями, различая их с помощью охранных условий. Microsoft SQL Server расширяет функциональность с поддержкой охранных условий, а также с поддержкой Left Join через предложения. PostgreSQL поддерживает MERGE с версии 15, но ранее поддерживал слияние через CUBRID поддерживает оператор. И поддерживает использование синтаксиса. Он также поддерживает для совместимости с MySQL. Apache Phoenix поддерживает и синтаксис UPSERT SELECT. Spark SQL поддерживает и предложения в действиях. Apache Impala поддерживает .
CUBRID supports statement. And supports the use of syntax. It also supports for compatibility with MySQL. Apache Phoenix supports and UPSERT SELECT syntax. Spark SQL supports and clauses in actions. Apache Impala supports .
Использование в NoSQL
Аналогичная концепция применяется в некоторых NoSQL базах данных. Например, в MongoDB поля в значении, связанном с ключом, могут быть обновлены с помощью операции. Операция вызывает ошибку, если ключ не найден. В этой операции можно установить флаг: в этом случае новое значение сохраняется, связанное с данным ключом, если он не существует, иначе всё значение заменяется. В Redis операция set устанавливает значение, связанное с данным ключом. Redis не знает никаких деталей о внутренней структуре значения, поэтому обновление не имеет смысла. Следовательно, операция set всегда имеет семантику установки или замены.