我正在编写一个触发器以在“ 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 dello Stato per l anno finanziario 2018 e bilancio pluriennale per il triennio 2018-2020,2017-12-22, 903,摄影机),而不是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]每两年一次的预售dello Stato和2018年至2020年的bilancio pluriennale,2017-12-22,903,相机)的非nella tabella“ attivita_parlamentare”。
触发:
CREATE TRIGGER inserimento
插入之前 在public.modifica 每行 执行程序public.inserimento_modifica();
触发功能:
-- 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;
The image is from the attivita_parlamentare table 表修改:
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_parlament的子表为:1°interrogazione_interpellanza 2°介入
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;