sql >> Database >  >> RDS >> PostgreSQL

Gebruik meerdere conflict_targets in ON CONFLICT-clausule

ON CONFLICT vereist een unieke index* om de conflictdetectie uit te voeren. U hoeft dus alleen een unieke index op beide kolommen te maken:

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

* Naast unieke indexen kunt u ook uitsluitingsbeperkingen gebruiken. Deze zijn iets algemener dan unieke beperkingen. Stel dat uw tabel kolommen had voor id en valid_time (en valid_time is een tsrange ), en je wilde dubbele id . toestaan s, maar niet voor overlappende perioden. Een unieke beperking zal u niet helpen, maar met een uitsluitingsbeperking kunt u zeggen "nieuwe records uitsluiten als hun id is gelijk aan een oude id en ook hun valid_time overlapt zijn valid_time ."



  1. FOUT:kolom van relatie bestaat niet PostgreSQL, kan invoegquery niet uitvoeren

  2. Een 64-bits applicatie verbinden met Acomba

  3. SQL-ontwikkelaar 4.1.3 vrijgegeven

  4. PostgreSql INSERT FROM SELECT RETURNING ID