From: | Heikki Linnakangas <hlinnaka(at)iki(dot)fi> |
---|---|
To: | Andres Freund <andres(at)anarazel(dot)de>, Peter Geoghegan <pg(at)heroku(dot)com> |
Cc: | Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>, Stephen Frost <sfrost(at)snowman(dot)net>, Robert Haas <robertmhaas(at)gmail(dot)com>, Pg Hackers <pgsql-hackers(at)postgresql(dot)org>, Bruce Momjian <bruce(at)momjian(dot)us>, Jeff Janes <jeff(dot)janes(at)gmail(dot)com> |
Subject: | Re: INSERT ... ON CONFLICT syntax issues |
Date: | 2015-04-26 09:22:01 |
Message-ID: | 553CAE39.9020905@iki.fi |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 04/25/2015 12:01 PM, Andres Freund wrote:
> INSERT ... ON CONFLICT (cola, colb [WHERE predicate_for_partial]) UPDATE|IGNORE
>
> My problem with the WHERE being inside the parens in the above is that
> it's
> a) different from CREATE INDEX
> b) unclear whether the WHERE belongs to colb or the whole index
> expression. The equivalent for aggregates, which I bet is going to be
> used less often, caused a fair amount of confusing.
>
> That's why I wanted the WHERE outside the (), which requires either
> adding DO between the index inference clause, and the action, to avoid
> ambiguities in the grammar.
Yeah, having the WHERE outside the parens seems much nicer. What is the
ambiguity?
> But I'm generally having some doubts about the syntax.
>
> Right now it's
> INSERT ... ON CONFLICT opt_on_conf_clause UPDATE|IGNORE.
>
> A couple things:
>
> a) Why is is 'CONFLICT"? We're talking about a uniquness violation. What
> if we, at some later point, also want to handle other kind of
> violations? Shouldn't it be ON UNIQUE CONFLICT/ERROR/VIOLATION ...
As Peter said, it's also for exclusion constraints. Perhaps "ON
CONSTRAINT VIOLATION"? It doesn't apply to foreign key constraints,
though. I think "ON CONFLICT" is fine.
> b) For me there's a WITH before the index inference clause missing, to
> have it read in 'SQL' style.
Agreed. ON would sound more natural than WITH though:
INSERT INTO mytable ON CONFLICT ON (keycol) UPDATE ...
The ability to specify a constraint by name hasn't been implemented, but
that would read quite naturally as:
INSERT INTO mytable ON CONFLICT ON CONSTRAINT my_constraint UPDATE ...
- Heikki
From | Date | Subject | |
---|---|---|---|
Next Message | Andres Freund | 2015-04-26 10:08:24 | Re: INSERT ... ON CONFLICT syntax issues |
Previous Message | Andres Freund | 2015-04-26 08:36:42 | Re: inherit support for foreign tables |