<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh">
	<id>https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Merge_%28SQL%29</id>
	<title>Merge (SQL) - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://arolstar52-zhtest.hf.space/index.php?action=history&amp;feed=atom&amp;title=Merge_%28SQL%29"/>
	<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Merge_(SQL)&amp;action=history"/>
	<updated>2026-06-26T01:56:58Z</updated>
	<subtitle>在这个wiki上该页的修订历史</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://arolstar52-zhtest.hf.space/index.php?title=Merge_(SQL)&amp;diff=4870922&amp;oldid=prev</id>
		<title>imported&gt;InternetArchiveBot：​补救19个来源，并将0个来源标记为失效。) #IABot (v2.0.9.5) (KCUSCBZMOGYNMYBGBBFRQQIZCGYNKGOC - 28909</title>
		<link rel="alternate" type="text/html" href="https://arolstar52-zhtest.hf.space/index.php?title=Merge_(SQL)&amp;diff=4870922&amp;oldid=prev"/>
		<updated>2026-03-17T11:46:59Z</updated>

		<summary type="html">&lt;p&gt;补救19个来源，并将0个来源标记为失效。) #IABot (v2.0.9.5) (&lt;a href=&quot;/index.php?title=User:KCUSCBZMOGYNMYBGBBFRQQIZCGYNKGOC&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;User:KCUSCBZMOGYNMYBGBBFRQQIZCGYNKGOC（页面不存在）&quot;&gt;KCUSCBZMOGYNMYBGBBFRQQIZCGYNKGOC&lt;/a&gt; - 28909&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[关系数据库管理系统]]使用[[SQL]]&amp;#039;&amp;#039;&amp;#039;{{mono|MERGE}}&amp;#039;&amp;#039;&amp;#039;语句（也被称为&amp;#039;&amp;#039;&amp;#039;upsert&amp;#039;&amp;#039;&amp;#039;）来处理数据：它根据特定的匹配条件，决定是[[插入 (SQL)|插入]]（INSERT）新记录，还是[[update|更新]]（UPDATE）或[[删除 (SQL)|删除]]（DELETE）现有记录。该语句在{{tsl|en|SQL:2003}}标准中被正式引入，并在{{tsl|en|SQL:2008}}标准中得到了进一步扩展。&lt;br /&gt;
==用法==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;zetasql&amp;quot;&amp;gt;&lt;br /&gt;
MERGE INTO tablename USING table_reference ON (condition)&lt;br /&gt;
  WHEN MATCHED THEN&lt;br /&gt;
    UPDATE SET column1 = value1 [, column2 = value2 ...]&lt;br /&gt;
  WHEN NOT MATCHED THEN&lt;br /&gt;
    INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...]);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{mono|MERGE}}语句在目标表（{{mono|INTO}}表）和源表（{{mono|USING}}表/视图/子查询）之间执行[[连接|右连接]]（Right Join）——其中目标表为左表，源表为右表。四种可能的组合产生了以下规则：&lt;br /&gt;
*源表中有，目标表中也有（{{mono|ON}}条件匹配）：执行{{mono|UPDATE}}。&lt;br /&gt;
*源表中有，目标表中没有（{{mono|ON}}条件不匹配）：执行{{mono|INSERT}}。&lt;br /&gt;
*源表中没有，目标表中有：不执行任何操作。&lt;br /&gt;
*源表和目标表中都没有：不执行任何操作。&lt;br /&gt;
&lt;br /&gt;
注意：根据{{tsl|en|SQL:2003}}标准，如果多个源表行匹配同一个目标表行，必须报错。你不能使用一条{{mono|MERGE}}语句多次更新同一行目标表数据。&lt;br /&gt;
==实现情况==&lt;br /&gt;
[[PostgreSQL]]&amp;lt;ref&amp;gt;{{cite web |title=E.1. Release 15 |url=https://www.postgresql.org/docs/15/release-15.html |website=PostgreSQL Documentation |access-date=13 October 2022 |language=en |date=13 October 2022 |url-status=live |archive-url=https://web.archive.org/web/20221013141239/https://www.postgresql.org/docs/15/release-15.html |archive-date=13 October 2022 }}&amp;lt;/ref&amp;gt;、[[Oracle数据库|Oracle]]、[[IBM DB2|DB2]]、[[SQL Server]]等主流数据库均支持标准语法。&lt;br /&gt;
==={{anchor|upsert}}同义词===&lt;br /&gt;
一些数据库实现采用了&amp;#039;&amp;#039;&amp;#039;Upsert&amp;#039;&amp;#039;&amp;#039;（Update和Insert的[[混成词]]）这一术语，指代“如果记录不存在则插入，如果已存在则更新”的数据库语句或组合。[[PostgreSQL]] (v9.5+)&amp;lt;ref&amp;gt;{{Cite web |title=PostgreSQL Upsert Using INSERT ON CONFLICT statement |url=http://www.postgresqltutorial.com/postgresql-upsert/ |url-status=live |archive-url=https://web.archive.org/web/20221128173803/https://www.postgresqltutorial.com/postgresql-tutorial/postgresql-upsert/ |archive-date=Nov 28, 2022 |website=PostgreSQL Tutorial}}&amp;lt;/ref&amp;gt;、[[SQLite]](v3.24+)&amp;lt;ref&amp;gt;&amp;quot;[http://sqlite.org/lang_UPSERT.html upsert] {{Wayback|url=http://sqlite.org/lang_UPSERT.html |date=20260313210436 }}&amp;quot;, SQLite, visited 6-6-2018.&amp;lt;/ref&amp;gt; 、[[Microsoft Azure SQL Database]]&amp;lt;ref&amp;gt;{{Cite web |title=MERGE (Transact-SQL) |url=https://msdn.microsoft.com/en-us/library/bb510625.aspx |url-status=live |archive-url=https://web.archive.org/web/20160624122818/https://msdn.microsoft.com/en-us/library/bb510625.aspx |archive-date=Jun 24, 2016 |website=Transact-SQL Reference (Database Engine) |publisher=Microsoft Learn}}&amp;lt;/ref&amp;gt;均使用此术语。&lt;br /&gt;
&lt;br /&gt;
{{tsl|en|SQL:2003}}标准定义了MERGE 语句，用以提供类似的功能。&lt;br /&gt;
&lt;br /&gt;
通常情况下，数据库操作运行在多个代理（Agent/进程）同时对同一个数据库执行查询的环境中。如果数据库管理系统（DBMS）本身不支持原生版本的UPSERT或MERGE，则该操作应当封装在一个事务（Transaction）中，以确保其隔离性（Isolation）和原子性（Atomicity）。&lt;br /&gt;
&lt;br /&gt;
===其他非标准实现===&lt;br /&gt;
在[[MySQL]]中，UPSERT操作是通过{{mono|INSERT ... ON DUPLICATE KEY UPDATE}}语法实现的（即：如果行已存在，则执行更新操作）&amp;lt;ref&amp;gt;[http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html MySQL :: MySQL 5.1 Reference Manual :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE Syntax]&amp;lt;/ref&amp;gt;。但限制是连接必须基于主键或唯一索引。此外还支持{{code|&amp;gt;REPLACE INTO}}（先删再插）&amp;lt;ref&amp;gt;{{Cite web |url=http://dev.mysql.com/doc/refman/5.1/en/replace.html |title=MySQL 5.1 Reference Manual: 11.2.6 REPLACE Syntax |access-date=2026-03-13 |archive-date=2016-05-06 |archive-url=https://web.archive.org/web/20160506162118/https://dev.mysql.com/doc/refman/5.1/en/replace.html |dead-url=no }}&amp;lt;/ref&amp;gt;，即首先尝试进行插入操作；如果插入失败，则删除已存在的行（若存在），最后再插入新记录。还支持{{code|INSERT IGNORE}}&amp;lt;ref&amp;gt;{{cite web|title=MySQL 5.5 Reference Manual :: 13.2.5 INSERT Syntax|url=http://dev.mysql.com/doc/refman/5.5/en/insert.html|accessdate=29 October 2013|archive-date=2013-10-24|archive-url=https://web.archive.org/web/20131024022919/http://dev.mysql.com/doc/refman/5.5/en/insert.html|dead-url=no}}&amp;lt;/ref&amp;gt;，告知服务器忽略“重复键（duplicate key）”错误并继续执行（即：现有的行不会被插入或更新，但所有新的行都会被正常插入）。&lt;br /&gt;
&lt;br /&gt;
[[SQLite]]：支持{{code|lang=sql|INSERT OR REPLACE INTO}}。还支持{{code|REPLACE INTO}}作为兼容MySQL的别名。&amp;lt;ref&amp;gt;{{cite web|url=http://www.sqlite.org/lang_insert.html|title=SQL As Understood By SQLite: INSERT|accessdate=2012-09-27|archive-date=2012-09-23|archive-url=https://web.archive.org/web/20120923204825/http://www.sqlite.org/lang_insert.html|dead-url=no}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Firebird (数据库)|Firebird]]支持{{code|MERGE INTO}}。还支持单行版本的{{code|lang=sql|UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)]}}，但后者无法在插入和更新时采取不同的操作（例如仅为新行设置序列值）。 &lt;br /&gt;
&lt;br /&gt;
[[IBM DB2]]：扩展了多个{{code|WHEN MATCHED}}和{{code|WHEN NOT MATCHED}}子句，并支持通过{{code|... AND some-condition}}条件进行细分过滤。&lt;br /&gt;
&lt;br /&gt;
[[Microsoft SQL Server]]：支持通过 WHEN NOT MATCHED BY SOURCE 来处理源表中不存在但目标表中存在的行（即支持了左连接语义）。&lt;br /&gt;
&lt;br /&gt;
[[PostgreSQL]]自第15版本起开始支持MERGE语句，但在此之前，它通过{{code|2=postgresql|INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action}}.&amp;lt;ref&amp;gt;{{Cite web |url=http://www.postgresql.org/docs/current/static/sql-insert.html |title=PostgreSQL INSERT page |access-date=2026-03-13 |archive-date=2016-12-28 |archive-url=https://web.archive.org/web/20161228033136/https://www.postgresql.org/docs/current/static/sql-insert.html |dead-url=no }}&amp;lt;/ref&amp;gt;语法来支持合并操作。&lt;br /&gt;
&lt;br /&gt;
[[CUBRID]]支持MERGE INTO语句&amp;lt;ref&amp;gt;{{cite web|url=http://www.cubrid.org/blog/news/announcing-cubrid-9-0-with-3x-performance-increase-and-sharding-support|title=New CUBRID 9.0.0|publisher=CUBRID Official Blog|date=2012-10-30|accessdate=2012-11-08|archive-date=2012-11-05|archive-url=https://web.archive.org/web/20121105232623/http://www.cubrid.org/blog/news/announcing-cubrid-9-0-with-3x-performance-increase-and-sharding-support/|dead-url=yes}}&amp;lt;/ref&amp;gt;，同时也支持使用{{code|lang=mysql|INSERT ... ON DUPLICATE KEY UPDATE}}语法&amp;lt;ref&amp;gt;{{Cite web |url=http://www.cubrid.org/manual/10_0/en/sql/query/insert.html#on-duplicate-key-update-clause |title=CUBRID :: Data Manipulation Statements :: Insert :: ON DUPLICATE KEY UPDATE Clause |access-date=2026-03-13 |archive-date=2016-10-07 |archive-url=https://web.archive.org/web/20161007120937/http://www.cubrid.org/manual/10_0/en/sql/query/insert.html#on-duplicate-key-update-clause |dead-url=yes }}&amp;lt;/ref&amp;gt;。为了兼容MySQL，它还支持{{code|REPLACE INTO}}。&amp;lt;ref&amp;gt;{{Cite web |url=http://www.cubrid.org/manual/10_0/en/sql/function/string_fn.html#replace |title=CUBRID :: Data Manipulation Statements :: Replace |access-date=2026-03-13 |archive-date=2016-10-07 |archive-url=https://web.archive.org/web/20161007120918/http://www.cubrid.org/manual/10_0/en/sql/function/string_fn.html#replace |dead-url=yes }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tsl|en|Apache Phoenix}}支持{{code|UPSERT VALUES}}&amp;lt;ref&amp;gt;{{cite web|url=https://phoenix.apache.org/language/#upsert_values|title=UPSERT VALUES|access-date=2026-03-13|archive-date=2016-12-27|archive-url=https://web.archive.org/web/20161227200617/https://phoenix.apache.org/language/#upsert_values|dead-url=no}}&amp;lt;/ref&amp;gt;和&amp;lt;code&amp;gt;UPSERT SELECT&amp;lt;/code&amp;gt;&amp;lt;ref&amp;gt;{{cite web|url=https://phoenix.apache.org/language/#upsert_select|title=UPSERT SELECT|access-date=2026-03-13|archive-date=2016-12-27|archive-url=https://web.archive.org/web/20161227200617/https://phoenix.apache.org/language/#upsert_select|dead-url=no}}&amp;lt;/ref&amp;gt;语法。&lt;br /&gt;
&lt;br /&gt;
[[Apache Spark|Spark SQL]]在操作中支持{{code|UPDATE SET *}}和{{code|INSERT *}}子句。&amp;lt;ref&amp;gt;{{cite web|url=https://docs.databricks.com/spark/latest/spark-sql/language-manual/delta-merge-into.html|title=MERGE INTO (Delta Lake on Databricks)|access-date=2026-03-13|archive-date=2022-10-01|archive-url=https://web.archive.org/web/20221001043630/https://docs.databricks.com/spark/latest/spark-sql/language-manual/delta-merge-into.html|dead-url=no}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{tsl|en|Apache Impala}}支持{{code|UPSERT INTO ... SELECT}}语法。&amp;lt;ref&amp;gt;{{cite web|url=https://impala.apache.org/docs/build/html/topics/impala_upsert.html|title=UPSERT Statement (Apache Impala Documentation)|access-date=2026-03-13|archive-date=2025-02-20|archive-url=https://web.archive.org/web/20250220114146/https://impala.apache.org/docs/build/html/topics/impala_upsert.html|dead-url=no}}&amp;lt;/ref&amp;gt; &lt;br /&gt;
==在NoSQL中的应用==&lt;br /&gt;
类似的概念也应用于某些[[NoSQL]]数据库中。&lt;br /&gt;
&lt;br /&gt;
在[[MongoDB]]中，可以通过{{code|update}}操作更新与键相关联的值中的字段。如果找不到该键，{{code|update}}操作会报错。但在{{code|update}}操作中可以设置{{code|upsert}}标志：在这种情况下，如果键不存在，则存储一个与给定键关联的新值；否则，整个值将被替换。&lt;br /&gt;
&lt;br /&gt;
在[[Redis]]中，{{code|SET}}操作用于设置与给定键关联的值。由于Redis不了解该值内部结构的任何细节，因此“更新（update）”操作没有意义。所以{{code|SET}}操作始终具有“设置或替换（set or replace）”的语义。&lt;br /&gt;
==参考文献==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&amp;lt;!-- from upsert: --&amp;gt;&lt;br /&gt;
*{{cite web|title=Cross Compare of SQL Server, MySQL, and PostgreSQL|date=May 18, 2008|url=http://www.postgresonline.com/journal/archives/51-Cross-Compare-of-SQL-Server,-MySQL,-and-PostgreSQL.html|work=Postgres OnLine Journal|first1=Leo|last1=Hsu|first2=Regina|last2=Obe|accessdate=8 October 2010|archive-date=2010-11-26|archive-url=https://web.archive.org/web/20101126223724/http://postgresonline.com/journal/archives/51-Cross-Compare-of-SQL-Server,-MySQL,-and-PostgreSQL.html|dead-url=no}}&lt;br /&gt;
*{{cite book |last= Chodorow |first= Kristina |author2=Mike Dirolf |title= [[MongoDB: The Definitive Guide]] |publisher= [[O&amp;#039;Reilly Media|O&amp;#039;Reilly]] |date=September 2010 |isbn= 978-1-449-38156-1}}&lt;br /&gt;
&lt;br /&gt;
==外部链接==&lt;br /&gt;
* [http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9016.htm#SQLRF01606 Oracle 11g Release 2 documentation] {{Wayback|url=http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_9016.htm#SQLRF01606 |date=20250602134221 }} on {{code|MERGE}}&lt;br /&gt;
* [http://www.firebirdsql.org/refdocs/langrefupd21-merge.html Firebird 2.1 documentation] {{Wayback|url=http://www.firebirdsql.org/refdocs/langrefupd21-merge.html |date=20250802234005 }} on {{code|MERGE}}&lt;br /&gt;
* [http://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0010873.html DB2 v9 MERGE statement] {{Wayback|url=http://www.ibm.com/support/knowledgecenter/SSEPGG_9.7.0/com.ibm.db2.luw.sql.ref.doc/doc/r0010873.html |date=20161011070450 }}&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/bb510625.aspx Microsoft SQL Server documentation] {{Wayback|url=http://msdn.microsoft.com/en-us/library/bb510625.aspx |date=20161111033332 }}&lt;br /&gt;
* [http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_merge_statement HSQLdb 2.0 Data Change Statements] {{Wayback|url=http://hsqldb.org/doc/2.0/guide/dataaccess-chapt.html#dac_merge_statement |date=20251126094402 }}&lt;br /&gt;
* [http://www.h2database.com/html/grammar.html#merge H2 (1.2) SQL Syntax page] {{Wayback|url=http://www.h2database.com/html/grammar.html#merge |date=20171212002904 }}&lt;br /&gt;
&lt;br /&gt;
{{SQL}}&lt;br /&gt;
&lt;br /&gt;
[[Category:SQL]]&lt;/div&gt;</summary>
		<author><name>imported&gt;InternetArchiveBot</name></author>
	</entry>
</feed>