sql >> Databasteknik >  >> RDS >> PostgreSQL

Använd flera konfliktmål i ON CONFLICT-satsen

ON CONFLICT kräver ett unikt index* för att göra konfliktdetekteringen. Så du behöver bara skapa ett unikt index på båda kolumnerna:

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

* Förutom unika index kan du även använda uteslutningsbegränsningar. Dessa är lite mer allmänna än unika begränsningar. Anta att din tabell hade kolumner för id och valid_time (och valid_time är en tsrange ), och du ville tillåta dubblett av id s, men inte för överlappande tidsperioder. En unik begränsning hjälper dig inte, men med en undantagsbegränsning kan du säga "uteslut nya poster om deras id är lika med ett gammalt id och även deras valid_time överlappar dess valid_time ."



  1. MariaDB JSON_DETAILED() Förklarad

  2. Lista alla funktioner i Oracle Database

  3. Hur expanderar jag kommaseparerade värden till separata rader med SQL Server 2005?

  4. Spolar enstaka markör