Как автоматически заполнять столбцы в строке на основе внешнего ключа, являющегося первичным ключом в другой таблице - PullRequest
0 голосов
/ 19 июня 2019

Я работаю над базой данных sql для QGIS. У меня есть 8 таблиц: 3 три из них являются базовыми таблицами, а остальные являются реляционными таблицами. Одна реляционная таблица, "tabela_is_po", имеет 4 поля:

indice_sequencial_po (integer and Primary Key),
tema (character varying),
subtema (character varying),
designacao (character varying)

И базовая таблица "tabela_objecto_area" имеет 7 полей:

identificador integer ,
dtcc character varying(4),
planta_po boolean,
indice_sequencial_po integer (foreign key),
tema_po character varying(254),
subtema_po character varying(254),
designacao_po character varying(254)

В «области tabela_objecto», когда я заполняю целое число indice_sequencial_po (внешний ключ), я хочу, чтобы таблица могла автоматически получать данные из реляционной таблицы tabela_is_po на основе числа, которое заполняется в indice_sequencial_po.

Я пробовал функцию триггера, но она никогда не работала хорошо.

код tabela_objecto_area:

CREATE TABLE  pdm2019.tabela_objecto_area
(
identificador integer NOT NULL DEFAULT nextval('pdm2019.tabela_objecto_area_identificador_seq'::regclass),
dtcc character varying(4) NOT NULL DEFAULT '0101',
planta_po boolean NOT NULL,
indice_sequencial_po integer,
tema_po character varying(254),
subtema_po character varying(254),
designacao_po character varying(254),
CONSTRAINT tabela_objecto_area_pkey PRIMARY KEY (identificador)
)
WITH (
  OIDS=FALSE
);

Функция запуска:

CREATE OR REPLACE FUNCTION tema_e_subtema_automatico() RETURNS TRIGGER AS $tema_e_subtema_automatico$
    BEGIN
    IF NEW.pdm2019.tabela_objecto_area.indice_sequencial_po IS NOT NULL THEN
       INSERT INTO pdm2019.tabela_objecto_area(tema_po,subtema_po,designacao_po) SELECT tema,subtema,designacao FROM pdm2019.tabela_is_po WHERE indice_sequencial_po = NEW.pdm2019.tabela_objecto_area.indice_sequencial_po;
    END IF;
    END;
$tema_e_subtema_automatico$ LANGUAGE plpgsql;

CREATE TRIGGER tema_e_subtema_automatico AFTER INSERT OR UPDATE ON pdm2019.tabela_objecto_area
    FOR EACH ROW EXECUTE PROCEDURE tema_e_subtema_automatico();

1 Ответ

0 голосов
/ 19 июня 2019

Возможно, вам лучше использовать представление.См. https://en.wikipedia.org/wiki/Relational_model для обзора, в основном каждый элемент должен появляться в базе данных только один раз.

Для ввода данных часто проще использовать такую ​​среду, как django (https://www.djangoproject.com/), для создания структуры ваших таблиц и входных данных, которую затем можно просмотреть в qgis.

    CREATE TABLE  pdm2019.tabela_objecto_area
    (
    identificador integer NOT NULL DEFAULT nextval('pdm2019.tabela_objecto_area_identificador_seq'::regclass),
    dtcc character varying(4) NOT NULL DEFAULT '0101',
    planta_po boolean NOT NULL,
    indice_sequencial_po integer,
    -- tema_po character varying(254), -- use a view to populate these
    -- subtema_po character varying(254), -- use a view to populate these
    -- designacao_po character varying(254), -- use a view to populate these
    CONSTRAINT tabela_objecto_area_pkey PRIMARY KEY (identificador)
    )
    WITH (
      OIDS=FALSE
    );

    CREATE VIEW v_tabela_objecto_area as (
    select a.*, b.tema_po, b.subtema_po, b.designacao_po 
    from tabela_objecto_area a, tabela_is_po b
    where a.indice_sequencial_po = b.indice_sequencial_po);
...