Merge (SQL)
A relational database management system uses SQL MERGE
(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.
Usage
MERGE INTO tablename USING table_reference ON (condition)
WHEN MATCHED THEN
UPDATE SET column1 = value1 [, column2 = value2 ...]
WHEN NOT MATCHED THEN
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);
Right join is employed over the Target (the INTO table) and the Source (the USING table / view / sub-query). That is:
- If rows present in the Source but missing from the Target do run the action then specifically the NOT MATCHED action
- If rows missing from the Source and present in Target are ignored then no action is performed on the Target.
If multiple Source rows match a given Target row, an error is mandated by SQL:2003 standards. You cannot update a Target row multiple times with a MERGE statement
Implementations
Database management systems Oracle Database, DB2, Teradata, EXASOL, CUBRID, MS SQL and Vectorwise support the standard syntax. Some also add non-standard SQL extensions.
Synonymous
Some database implementations adopted the term "Upsert" (a portmanteau of update and insert) to a database statement, or combination of statements, that inserts a record to a table in a database if the record does not exist or, if the record already exists, updates the existing record. It is also used to abbreviate the "MERGE" equivalent pseudo-code.
It is used in Microsoft SQL Azure.[1]
Other non-standard implementations
Some other database management systems support this, or very similar behavior, through their own, non-standard SQL extensions.
MySQL, for example, supports the use of
syntax[2] which can be used to achieve a similar effect with the limitation that the join between target and source has to be made only on PRIMARY KEY or UNIQUE constraints, which is not required in the ANSI/ISO standard. It also supports INSERT ... ON DUPLICATE KEY UPDATE
REPLACE INTO
syntax,[3] which first attempts an insert, and if that fails, deletes the row, if exists, and then inserts the new one. There is also an IGNORE
clause for the INSERT
statement,[4] which tells the server to ignore "duplicate key" errors and go on (existing rows will not be inserted or updated, but all new rows will be inserted).
SQLite's
works similarly. It also supports INSERT OR REPLACE INTO
REPLACE INTO
as an alias for compatibility with MySQL.[5]
Firebird supports MERGE INTO
though fails to throw an error when there are multiple Source data rows. Additionally there is a single-row version,
, but the latter does not give you the option to take different actions on insert versus update (e.g. setting a new sequence value only for new rows, not for existing ones.)UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)]
IBM DB2 extends the syntax with multiple WHEN MATCHED
and WHEN NOT MATCHED
clauses, distinguishing them with ... AND some-condition
guards.
Microsoft SQL extends with supporting guards and also with supporting Left Join via
clauses.WHEN NOT MATCHED BY SOURCE
PostgreSQL supports merging via
.[6]INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action
See also
- Join in particular:
References
- ↑ Transact-SQL Reference (Database Engine): MERGE (Transact-SQL)
- ↑ MySQL :: MySQL 5.1 Reference Manual :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE Syntax
- ↑ MySQL 5.1 Reference Manual: 11.2.6 REPLACE Syntax
- ↑ "MySQL 5.5 Reference Manual :: 13.2.5 INSERT Syntax". Retrieved 29 October 2013.
- ↑ "SQL As Understood By SQLite: INSERT". Retrieved 2012-09-27.
- ↑ PostgreSQL INSERT page
- Hsu, Leo; Obe, Regina (May 18, 2008). "Cross Compare of SQL Server, MySQL, and PostgreSQL". Postgres OnLine Journal. Retrieved 8 October 2010.
- Chodorow, Kristina; Mike Dirolf (September 2010). MongoDB: The Definitive Guide. O'Reilly. ISBN 978-1-449-38156-1.
External links
- Oracle 11g Release 2 documentation on MERGE
- Firebird 2.1 documentation on MERGE
- DB2 v9 MERGE statement
- Microsoft SQL Server documentation
- H2 (1.2) SQL Syntax page
|