PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Използвайте множество конфликт_цели в клауза ON CONFLICT

ON CONFLICT изисква уникален индекс* за откриване на конфликт. Така че просто трябва да създадете уникален индекс за двете колони:

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

* В допълнение към уникалните индекси, можете да използвате и ограничения за изключване. Това са малко по-общи от уникалните ограничения. Да предположим, че вашата таблица има колони за id и valid_timevalid_time е tsrange ), и искахте да разрешите дублиран id s, но не и за припокриващи се периоди от време. Уникално ограничение няма да ви помогне, но с ограничение за изключване можете да кажете „изключете нови записи, ако техният id равно на стар id както и тяхното valid_time припокрива своето valid_time ."



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. django.db.utils.ProgrammingError:връзката вече съществува

  2. Как да групирате времеви печати в острови (въз основа на произволна празнина)?

  3. Задействане с име на динамично поле

  4. Ръководство за PGpool - съвети и наблюдения:част трета

  5. Изцяло игнориране на часовите зони в Rails и PostgreSQL