Home Explore Blog CI



postgresql

2nd chunk of `doc/src/sgml/ref/merge.sgml`
dec8f31ea65184de2baf2a1db95c4d9a34a68aa10aad24e90000000100000fa6
 class="parameter">sub-SELECT</replaceable> )
           } [, ...]

<phrase>and <replaceable class="parameter">merge_delete</replaceable> is:</phrase>

DELETE
</synopsis>
 </refsynopsisdiv>

 <refsect1>
  <title>Description</title>

  <para>
   <command>MERGE</command> performs actions that modify rows in the
   target table identified as <replaceable class="parameter">target_table_name</replaceable>,
   using the <replaceable class="parameter">data_source</replaceable>.
   <command>MERGE</command> provides a single <acronym>SQL</acronym>
   statement that can conditionally <command>INSERT</command>,
   <command>UPDATE</command> or <command>DELETE</command> rows, a task
   that would otherwise require multiple procedural language statements.
  </para>

  <para>
   First, the <command>MERGE</command> command performs a join
   from <replaceable class="parameter">data_source</replaceable> to
   the target table
   producing zero or more candidate change rows.  For each candidate change
   row, the status of <literal>MATCHED</literal>,
   <literal>NOT MATCHED BY SOURCE</literal>,
   or <literal>NOT MATCHED [BY TARGET]</literal>
   is set just once, after which <literal>WHEN</literal> clauses are evaluated
   in the order specified.  For each candidate change row, the first clause to
   evaluate as true is executed.  No more than one <literal>WHEN</literal>
   clause is executed for any candidate change row.
  </para>

  <para>
   <command>MERGE</command> actions have the same effect as
   regular <command>UPDATE</command>, <command>INSERT</command>, or
   <command>DELETE</command> commands of the same names. The syntax of
   those commands is different, notably that there is no <literal>WHERE</literal>
   clause and no table name is specified.  All actions refer to the
   target table,
   though modifications to other tables may be made using triggers.
  </para>

  <para>
   When <literal>DO NOTHING</literal> is specified, the source row is
   skipped. Since actions are evaluated in their specified order, <literal>DO
   NOTHING</literal> can be handy to skip non-interesting source rows before
   more fine-grained handling.
  </para>

  <para>
   The optional <literal>RETURNING</literal> clause causes <command>MERGE</command>
   to compute and return value(s) based on each row inserted, updated, or
   deleted.  Any expression using the source or target table's columns, or
   the <link linkend="merge-action"><function>merge_action()</function></link>
   function can be computed.  When an <command>INSERT</command> or
   <command>UPDATE</command> action is performed, the new values of the target
   table's columns are used.  When a <command>DELETE</command> is performed,
   the old values of the target table's columns are used.  The syntax of the
   <literal>RETURNING</literal> list is identical to that of the output list
   of <command>SELECT</command>.
  </para>

  <para>
   There is no separate <literal>MERGE</literal> privilege.
   If you specify an update action, you must have the
   <literal>UPDATE</literal> privilege on the column(s)
   of the target table
   that are referred to in the <literal>SET</literal> clause.
   If you specify an insert action, you must have the <literal>INSERT</literal>
   privilege on the target table.
   If you specify a delete action, you must have the <literal>DELETE</literal>
   privilege on the target table.
   If you specify a <literal>DO NOTHING</literal> action, you must have
   the <literal>SELECT</literal> privilege on at least one column
   of the target table.
   You will also need <literal>SELECT</literal> privilege on any column(s)
   of the <replaceable class="parameter">data_source</replaceable> and
   of the target table referred to
   in any <literal>condition</literal> (including <literal>join_condition</literal>)
   or <literal>expression</literal>.
   Privileges are tested once at statement start and are checked
   whether or not particular <literal>WHEN</literal> clauses are executed.

Title: Detailed Description of the MERGE Command in PostgreSQL
Summary
The MERGE command modifies rows in a target table using a data source. It joins the data source with the target table, setting a status (MATCHED, NOT MATCHED BY SOURCE, or NOT MATCHED) for each candidate row. WHEN clauses are evaluated in order, and the first true clause is executed. Actions are similar to regular UPDATE, INSERT, or DELETE commands. DO NOTHING skips the source row. The RETURNING clause returns values based on inserted, updated, or deleted rows. Appropriate privileges (UPDATE, INSERT, DELETE, SELECT) are required on the target table and data source columns based on the actions performed.