как включить подтаблицы - PullRequest
0 голосов
/ 27 марта 2019

Я пишу триггер для вставки данных в таблицу «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

...