meta data for this page
UPDATE OR INSERT
Added in: 2.1
Description
UPDATE OR INSERT checks if any existing records already contain the new values supplied for the MATCHING columns. If so, those records are updated. If not, a new record is inserted. In the absence of a MATCHING clause, matching is done against the primary key. If a RETURNING clause is present and more than one matching record is found, an error is raised.
Syntax
UPDATE OR INSERT INTO
{tablename | viewname} [(<columns>)]
VALUES (<values>)
[MATCHING (<columns>)]
[RETURNING <values> [INTO <variables>]]
<columns> ::= colname [, colname ...]
<values> ::= value [, value ...]
<variables> ::= :varname [, :varname ...]
Restrictions:
- No column may appear more than once in the update/insert column list.
- The INTO <variables> subclause is only available in PSQL.
- When returning values into the context variable NEW, this name must not be preceded by a colon (“:”).
Example
update or insert into Cows (Name, Number, Location)
values ('Suzie Moo', 3278823, 'Green Pastures')
matching (Number)
returning rec_id into :id;
Notes:
- Matches are determined with IS NOT DISTINCT, not with the “=” operator. This means that one NULL matches another.
- The optional RETURNING clause:
- …may contain any or all columns of the target table, regardless if they were mentioned earlier in the statement, but also other expressions.
- …may contain OLD and NEW qualifiers for field names; by default, the new field value is returned.
- …returns field values as they are after the BEFORE triggers have run, but before any AFTER triggers.