Я пишу триггер для вставки данных в таблицу «MODIFICA», но у этой таблицы есть внешний ключ, который берет данные из таблицы «ATTIVITA_PARLAMENTARE», но в этой таблице есть две вложенные таблицы, в которых на самом деле кортеживставлен, поэтому, когда я пытаюсь вставить кортеж в «MODIFICA», он говорит мне, что в «ATTIVITA_PARLAMENTARE» внешний ключ отсутствует, а вместо этого, потому что select возвращает результат вложенных таблиц, поэтому я использовал* чтобы указать, что дочерние таблицы включены, но ошибка всегда одинакова.Спасибо, кто мне помогает.
INSERT INTO public.modifica(
ddl,
numero_modifiche,
data,
testo_modifiche,
commissione_camera,
commissione_senato,
seduta_numero,
tipo_assemblea)
VALUES ('[Legge di bilancio 2018] Bilancio di previsione dello Stato per l anno finanziario 2018 e bilancio pluriennale per il triennio 2018-2020',
1,
'2017-12-22',
'https://parlamento17.openpolis.it/singolo_atto/92924', null,
null, 903, 'camera');
ВЫХОД:
ERRORE: la INSERT o l'UPDATE sulla tabella "modifica" viola il vincolo di chiave esterna "modifica_ddl_fkey"
ДЕТАЛИ: La chiave (ddl, data, seduta_numero, tipo_assemblea) = ([Legge di bilancio 2018] Bilancio di previsioneСтатистический сборник за 2018-2020, 2017-12-22, 903, фотоаппарат) non è Presente Nella Tabella "attivita_parlamentare".********** Ошибка **********
ОШИБКА: УСТАНОВИТЬ ОБНОВЛЕНИЕ sulla tabella "modifica" альт il vincolo di chiave esterna "modifica_ddl_fkey" SQLсостояние: 23503 Деталь: La chiave (ddl, data, seduta_numero, tipo_assemblea) = ([Legge di bilancio 2018] Билансио предвидения дел за статую за год до 2018 года, за 12 сентября 2018-2020 годы, 2017-12-22,903, фотоаппарат) nonè preste nella tabella "attivita_parlamentare".
TRIGGER:
CREATE TRIGGER inserimento
ПЕРЕД ВСТАВКОЙ В public.modifica ДЛЯ КАЖДОЙ СТРОКИ ВЫПОЛНИТЬ ПРОЦЕДУРУ public.inserimento_modifica ();
1015 * ФУНКЦИЯ ТРИГГЕРА:
-- Function: public.inserimento_modifica()
-- DROP FUNCTION public.inserimento_modifica();
CREATE OR REPLACE FUNCTION public.inserimento_modifica()
RETURNS trigger AS
$BODY$
begin
IF EXISTS (select 1 from attivita_parlamentare*
where new.data=attivita_parlamentare.data
and new.ddl=attivita_parlamentare.ddl and
new.tipo_assemblea=attivita_parlamentare.tipo_assemblea
and new.seduta_numero=attivita_parlamentare.seduta_numero)
THEN
new.numero_modifiche=(select count(ddl)from modifica where ddl=new.ddl
)+1;
return new;
ELSE
IF EXISTS (select 1 from attivita_parlamentare*
where new.data=attivita_parlamentare.data
and new.ddl=attivita_parlamentare.ddl and
new.commissione_camera=attivita_parlamentare.commissione_camera
and new.seduta_numero=attivita_parlamentare.seduta_numero)
THEN
new.numero_modifiche=(select count(ddl)from modifica where
ddl=new.ddl )+1;
return new;
ELSE
IF EXISTS (select 1 from attivita_parlamentare*
where new.data=attivita_parlamentare.data
and new.ddl=attivita_parlamentare.ddl and
new.commissione_senato=attivita_parlamentare.commissione_senato
and new.seduta_numero=attivita_parlamentare.seduta_numero)
THEN
new.numero_modifiche=(select count(ddl)from modifica where
ddl=new.ddl )+1;
return new;
ELSE
raise exception 'NESSUNA MODIFICA PRESENTE IN % DATA PER
QUEL
DDL %', new.data,new.ddl;
END IF;
END IF;
END IF;
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION public.inserimento_modifica()
OWNER TO postgres;
Изображение из таблицы attivita_parlamentare модификация таблицы:
CREATE TABLE public.modifica
(
ddl character varying(500) NOT NULL,
numero_modifiche integer,
data date NOT NULL,
testo_modifiche text,
commissione_camera character varying(100),
commissione_senato character varying(100),
seduta_numero integer,
tipo_assemblea character varying(6),
CONSTRAINT modificapkey PRIMARY KEY (ddl, data),
CONSTRAINT modifica_ddl_fkey FOREIGN KEY (ddl, data, seduta_numero,
tipo_assemblea)
REFERENCES public.attivita_parlamentare (ddl, data, seduta_numero,
tipo_assemblea) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.modifica
OWNER TO postgres;
GRANT ALL ON TABLE public.modifica TO postgres;
GRANT ALL ON TABLE public.modifica TO public;
таблица attivita_parlamentare:
CREATE TABLE public.attivita_parlamentare
(
data date NOT NULL,
ora time with time zone NOT NULL,
ddl character varying(500) NOT NULL,
commissione_camera character varying(100),
commissione_senato character varying(100),
seduta_numero integer NOT NULL,
tipo_assemblea character varying(6),
parlamentare character varying(100)[] NOT NULL,
CONSTRAINT attivita_parlamentare_pkey PRIMARY KEY (parlamentare, data,
ora, ddl, seduta_numero),
CONSTRAINT attivita_parlamentare_seduta_numero_fkey FOREIGN KEY
(seduta_numero, tipo_assemblea)
REFERENCES public.ordine_del_giorno_ass_cam_e_sen (seduta_numero,
tipo_assemblea) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT attivitaparlamentarecommissionecamerafkey FOREIGN KEY
(commissione_camera)
REFERENCES public.commissioni_camera (nome) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT attivitaparlamentarecommissionesenatofkey FOREIGN KEY
(commissione_senato)
REFERENCES public.commissioni_senato (nome) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT attivitaparlamentaredatafkey FOREIGN KEY (data)
REFERENCES public.ordine_del_giorno_ass_cam_e_sen (data) MATCH
SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT attivitaparlamentareddlfkey FOREIGN KEY (ddl)
REFERENCES public.esame_ddl_e_presentazione_ddl_camera (ddl) MATCH
SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT attivitaparlamentareddlfkey1 FOREIGN KEY (ddl)
REFERENCES public.esame_ddl_e_presentazione_ddl_senato (ddl) MATCH
SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT
attivita_parlamentare_data_ddl_tipo_assemblea_seduta_numero_key UNIQUE
(data, ddl, tipo_assemblea, seduta_numero),
CONSTRAINT attivitaparlamentaresedutanumerotipoassembleakey UNIQUE
(seduta_numero, tipo_assemblea)
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.attivita_parlamentare
OWNER TO postgres;
GRANT ALL ON TABLE public.attivita_parlamentare TO postgres;
GRANT ALL ON TABLE public.attivita_parlamentare TO public;
COMMENT ON TABLE public.attivita_parlamentare
IS '--ci sono più attività parlamentari riguardanti lo stesso ddl
che si svolgono
--sia nelle varie commissioni (cam e sen) sia nelle assemblee (cam
e sen), quindi è --legittima
--la provenienza da tutte e 3 le tabelle (foreign key)';
вложенные таблицы attivita_parlamentare: 1 ° interrogazione_interpellanza 2 ° intervento
CREATE TABLE public.intervento
(
ddl character varying(500) NOT NULL,
data date NOT NULL,
ora time with time zone NOT NULL,
testo text,
commissione_camera character varying(100),
commissione_senato character varying(100),
seduta_numero integer,
tipo_assemblea character varying(6),
parlamentare character varying(100)[] NOT NULL,
CONSTRAINT intervento_pkey PRIMARY KEY (parlamentare, ddl, ora)
)
INHERITS (public.attivita_parlamentare)
WITH (
OIDS=FALSE
);
ALTER TABLE public.intervento
OWNER TO postgres;
GRANT ALL ON TABLE public.intervento TO postgres;
GRANT ALL ON TABLE public.intervento TO public;
CREATE TABLE public.interrogazione_interpellanza
(
data date NOT NULL,
ora time with time zone NOT NULL,
oggetto character varying(300) NOT NULL,
destinatario character varying(100),
commissione_camera character varying(100),
commissione_senato character varying(100),
testo text,
seduta_numero integer,
tipo_assemblea character varying(6),
ddl character varying(500),
parlamentare character varying(100)[] NOT NULL,
CONSTRAINT interrogazione_interpellanza_pkey PRIMARY
KEY(parlamentare,
oggetto),
CONSTRAINT interrogazione_interpellanza_data_parlamentare_key UNIQUE
(data,
parlamentare),
CONSTRAINT interrogazioneinterpellanzasedutanumerotipoassembleakey
UNIQUE
(seduta_numero, tipo_assemblea)
)
INHERITS (public.attivita_parlamentare)
WITH (
OIDS=FALSE
);
ALTER TABLE public.interrogazione_interpellanza
OWNER TO postgres;
GRANT ALL ON TABLE public.interrogazione_interpellanza TO
postgres;
GRANT ALL ON TABLE public.interrogazione_interpellanza TO
public;
таблица interrogazione
таблица intervento