PostgreSQL 9.5 UPSERT в правиле

У меня есть правило INSERT в обновляемой системе просмотра, для которой я хотел бы реализовать UPSERT, например:

CREATE OR REPLACE RULE _insert AS
ON INSERT TO vue_pays_gex.bals
DO INSTEAD (
INSERT INTO geo_pays_gex.voie(name, code, district) VALUES (new.name, new.code, new.district)
ON CONFLICT DO NOTHING;

Но я так как может быть много разных комбинаций этих трех столбцов, я не думаю, что могу установить CONSTRAINT, включая их всех (хотя, возможно, мне не хватает понимания в логике SQL), поэтому сведение значения ON CONFLIT DO NOTHING часть.

Идеальное решение, по-видимому, будет использовать EXCEPT, но оно работает только в инструкции INSERT INTO SELECT. Есть ли способ использовать инструкцию INSERT INTO SELECT, относящуюся к недавно вставленной строке? Что-то вроде FROM new.bals (в моем случае)?

Если бы я не мог представить условие ГДЕ НЕ СУЩЕСТВУЕТ, но возникает такая же проблема, как и прежде.

Я предполагаю, что это довольно распространенная потребность в SQL, но не может найти, как ее решить. Любая идея?

РЕДАКТИРОВАТЬ:

В соответствии с запросом, вот определение таблицы:

CREATE TABLE geo_pays_gex.voie
(
  id_voie serial NOT NULL,
  name character varying(50),
  code character varying(15),
  district character varying(50),
  CONSTRAINT prk_constraint_voie PRIMARY KEY (id_voie),
  CONSTRAINT voie_unique_key UNIQUE (name, code, district)
);
0
источник поделиться
1 ответ

Как вы определяете уникальность? Если это комбинация имени + код + район, то просто добавьте ограничение UNIQUE(name, code, district) в таблицу geo_pays_gex.voie. 3 вместе должны быть уникальными... но у вас может быть несколько раз одно и то же имя, или код, или район.

Посмотрите на http://rextester.com/EWR73154

EDIT ***

Поскольку вы можете иметь Nulls и хотите обрабатывать их как уникальное значение, вы можете заменить создание ограничения уникальным индексом, который заменяет нули

CREATE UNIQUE INDEX
voie_uniq ON voie
(COALESCE(name,''), code, COALESCE(district,''));
+1
источник

Посмотрите другие вопросы по меткам или Задайте вопрос