ON CONFLICT
kræver et unikt indeks* for at udføre konfliktdetekteringen. Så du skal bare oprette et unikt indeks på begge kolonner:
t=# create table t (id integer, a text, b text);
CREATE TABLE
t=# create unique index idx_t_id_a on t (id, a);
CREATE INDEX
t=# insert into t values (1, 'a', 'foo');
INSERT 0 1
t=# insert into t values (1, 'a', 'bar') on conflict (id, a) do update set b = 'bar';
INSERT 0 1
t=# select * from t;
id | a | b
----+---+-----
1 | a | bar
* Ud over unikke indekser kan du også bruge ekskluderingsbegrænsninger. Disse er lidt mere generelle end unikke begrænsninger. Antag, at din tabel havde kolonner for id
og valid_time
(og valid_time
er en tsrange
), og du ønskede at tillade dublet id
s, men ikke for overlappende tidsperioder. En unik begrænsning hjælper dig ikke, men med en ekskluderingsbegrænsning kan du sige "ekskluder nye poster, hvis deres id
er lig med et gammelt id
og også deres valid_time
overlapper dens valid_time
."