Many thanks, sorry for missing something so obvious! On Thu, Sep 27, 2018 at 1:45 PM, Tom Lane <t...@sss.pgh.pa.us> wrote:
> Charles Leifer <colei...@gmail.com> writes: > > I'm running into behavior I don't understand when trying to do an UPSERT > > with Postgres. The docs would seem to indicate that the conflict target > of > > the INSERT statement can be either an index expression or a constraint > > name. However, when attempting to reference the constraint name, I get a > > "column ... does not exist" error. > > What I see in the INSERT reference page is > > where conflict_target can be one of: > > ( { index_column_name | ( index_expression ) } [ COLLATE collation ] [ > opclass ] [, ...] ) [ WHERE index_predicate ] > ON CONSTRAINT constraint_name > > So you can write a parenthesized list of column names, or you can write > "ON CONSTRAINT constraint_name". Given your second example with > > create table kv ( > key text, > value text, > extra text, > constraint kv_key_value unique(key, value)); > > either of these work for me: > > regression=# insert into kv (key, value, extra) values ('k1', 'v1', 'e1') > on conflict (key, value) do update set extra=excluded.extra; > INSERT 0 1 > regression=# insert into kv (key, value, extra) values ('k1', 'v1', 'e1') > on conflict on constraint kv_key_value do update set > extra=excluded.extra; > INSERT 0 1 > > regards, tom lane >