sql >> Database teknologi >  >> RDS >> PostgreSQL

Brug flere konfliktmål i ON CONFLICT-klausulen

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 ."



  1. Hvad er SQL Server?

  2. Installation af Oracle Fusion Middleware / WebLogic Server 11g

  3. Relationel algebra

  4. Hvorfor svarer Oracles varchar-sorteringsrækkefølge ikke til varchar-sammenligningens adfærd?