如何包含子表

时间:2019-03-26 21:26:56

标签: postgresql inheritance triggers foreign-keys

我正在编写一个触发器以在“ 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;

interrogazione table

intervento table

0 个答案:

没有答案