Merge (SQL)

From Wikipedia, the free encyclopedia

Template:Short description

Page Module:Message box/ambox.css has no content.

A relational database management system uses SQL Page Template:Mono/styles.css has no content.MERGE (also called upsert) statements to Page Template:Mono/styles.css has no content.INSERT new records or Page Template:Mono/styles.css has no content.UPDATE or Page Template:Mono/styles.css has no content.DELETE existing records depending on whether condition matches. It was officially introduced in the SQL:2003 standard, and expanded[citation needed] 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 ...]);

A right join is employed over the Target (the Page Template:Mono/styles.css has no content.INTO table) and the Source (the Page Template:Mono/styles.css has no content.USING table / view / sub-query)--where Target is the left table and Source is the right one. The four possible combinations yield these rules:

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 Page Template:Mono/styles.css has no content.MERGE statement

Implementations

Database management systems PostgreSQL,[1] Oracle Database, IBM Db2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, MonetDB, Vectorwise and Apache Derby 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. This synonym is used in PostgreSQL (v9.5+)[2] and SQLite (v3.24+).[3] It is also used to abbreviate the "MERGE" equivalent pseudo-code.

It is used in Microsoft Azure SQL Database.[4]

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 INSERT ... ON DUPLICATE KEY UPDATE syntax[5] 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 >REPLACE INTO syntax,[6] 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,[7] 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 INSERT OR REPLACE INTO works similarly. It also supports REPLACE INTO as an alias for compatibility with MySQL.[8]

Firebird supports MERGE INTO though fails to throw an error when there are multiple Source data rows. Additionally there is a single-row version, UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)], 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.)

IBM Db2 extends the syntax with multiple WHEN MATCHED and WHEN NOT MATCHED clauses, distinguishing them with ... AND some-condition guards.

Microsoft SQL Server extends with supporting guards and also with supporting Left Join via WHEN NOT MATCHED BY SOURCE clauses.

PostgreSQL supports merge since version 15 but previously supported merging via INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action.[9]

CUBRID supports MERGE INTO[10] statement. And supports the use of INSERT ... ON DUPLICATE KEY UPDATE syntax.[11] It also supports REPLACE INTO for compatibility with MySQL.[12]

Apache Phoenix supports UPSERT VALUES[13] and UPSERT SELECT[14] syntax.

Spark SQL supports UPDATE SET * and INSERT * clauses in actions.[15]

Apache Impala supports UPSERT INTO ... SELECT.[16]

Usage in NoSQL

A similar concept is applied in some NoSQL databases.

In MongoDB the fields in a value associated with a key can be updated with an update operation. The update raises an error if the key is not found. In the update operation it is possible to set the upsert flag: in this case a new value is stored associated to the given key if it does not exist, otherwise the whole value is replaced.

In Redis the SET operations sets the value associated with a given key. Redis does not know any detail of the internal structure of the value, so an update would have no meaning. So the SET operation has always a set or replace semantics.

See also

References

  1. ^ Page Module:Citation/CS1/styles.css has no content."E.1. Release 15". PostgreSQL Documentation. 13 October 2022. Archived from the original on 13 October 2022. Retrieved 13 October 2022.
  2. ^ Page Module:Citation/CS1/styles.css has no content."PostgreSQL Upsert Using INSERT ON CONFLICT statement". PostgreSQL Tutorial. Archived from the original on Nov 28, 2022.
  3. ^ "upsert", SQLite, visited 6-6-2018.
  4. ^ Page Module:Citation/CS1/styles.css has no content."MERGE (Transact-SQL)". Transact-SQL Reference (Database Engine). Microsoft Learn. Archived from the original on Jun 24, 2016.
  5. ^ MySQL :: MySQL 5.1 Reference Manual :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE Syntax
  6. ^ MySQL 5.1 Reference Manual: 11.2.6 REPLACE Syntax
  7. ^ Page Module:Citation/CS1/styles.css has no content."MySQL 5.5 Reference Manual :: 13.2.5 INSERT Syntax". Retrieved 29 October 2013.
  8. ^ Page Module:Citation/CS1/styles.css has no content."SQL As Understood By SQLite: INSERT". Retrieved 2012-09-27.
  9. ^ PostgreSQL INSERT page
  10. ^ Page Module:Citation/CS1/styles.css has no content."New CUBRID 9.0.0". CUBRID Official Blog. 2012-10-30. Retrieved 2012-11-08.
  11. ^ CUBRID :: Data Manipulation Statements :: Insert :: ON DUPLICATE KEY UPDATE Clause
  12. ^ CUBRID :: Data Manipulation Statements :: Replace
  13. ^ Page Module:Citation/CS1/styles.css has no content."UPSERT VALUES".
  14. ^ Page Module:Citation/CS1/styles.css has no content."UPSERT SELECT".
  15. ^ Page Module:Citation/CS1/styles.css has no content."MERGE INTO (Delta Lake on Databricks)".
  16. ^ Page Module:Citation/CS1/styles.css has no content."UPSERT Statement (Apache Impala Documentation)".

Lua error in package.lua at line 80: module 'Module:Navbox/configuration' not found.