Вставить в только если 2 значения не существуют - PullRequest
0 голосов
/ 08 октября 2018

У меня есть такая таблица:

CREATE TABLE pratica
(
  progressivo text NOT NULL DEFAULT nextval('pratica_prog_seq'::regclass),
  commessa text NOT NULL,
  pla_uo text NOT NULL,
  tecnico text,
  pratica text NOT NULL,
  lcl_numero numeric(10,0),
  CONSTRAINT pratica_pkey PRIMARY KEY (progressivo)
)
WITH (
  OIDS=FALSE
);

И вторая таблица, такая как:

CREATE TABLE verifica_checklist
(
  gid text NOT NULL DEFAULT nextval('verifica_checklist_gid_seq'::regclass),
  progressivo text NOT NULL,
  commessa text NOT NULL,
  pla_uo text NOT NULL,
  tecnico text NOT NULL,
  pratica text NOT NULL,
  lcl_numero numeric(10,0),
  tipo_check text NOT NULL,
  data text NOT NULL,
  CONSTRAINT verifica_checklist_pkey PRIMARY KEY (gid)
)
WITH (
  OIDS=FALSE
);

Я хочу создать триггер, который вставит новую строку в таблицу verifica_checklist когда выполняются следующие условия:

new.prev_check_ok = 'Si' AND new.prev_check IS NULL

Я написал эту функцию и этот триггер, но каждый раз, когда я изменяю какое-либо значение, он вставляет новую строку в таблицу verifica_checklist, даже если она уже присутствует.

CREATE OR REPLACE FUNCTION checklist_verifica()
  RETURNS trigger AS
$BODY$
BEGIN
CASE
WHEN (new.prev_check_ok = 'Si' AND new.prev_check IS NULL) THEN 
INSERT INTO verifica_checklist(progressivo,commessa,pla_uo,tecnico,pratica,tipo_check,data) 
VALUES (NEW.progressivo, NEW.commessa, NEW.pla_uo, NEW.tecnico, NEW.pratica,'Preventivo',current_date);
ELSE NULL;
END CASE;
RETURN NEW;
END
$BODY$
  LANGUAGE plpgsql VOLATILE

CREATE TRIGGER checklist_verifica
  AFTER INSERT OR UPDATE
  ON pratica
  FOR EACH ROW
  WHEN (((((((new.prev_check_ok = 'Si'::text) AND (new.prev_check IS NULL)) OR ((new.sal1_check_ok = 'Si'::text) AND (new.sal1_check IS NULL))) OR ((new.sal2_check_ok = 'Si'::text) AND (new.sal2_check IS NULL))) OR ((new.servitu_check_ok = 'Si'::text) AND (new.servitu_check IS NULL))) OR ((new.def_check_ok = 'Si'::text) AND (new.def_check IS NULL))))
  EXECUTE PROCEDURE checklist_verifica();

Уникальными значениями являются столбец progressivo и значение в столбце tipo_check.Я мог бы иметь больше строк с тем же значением progressivo, но только с разными значениями столбца tipo_check.Как я мог решить?Спасибо

...