从 PostgreSQL/PostGIS 中的视图更新 table 数据
Update table data from view in PostgreSQL/PostGIS
我有一个实体关系模型,我试图在其中遵守规范化规则。但是为了通过 PostGIS 进入 QGIS 并且目前只有相关数据,我想通过一些视图工作,将这些视图显示到 QGIS 中并可能根据视图中所做的修改更新相应的 table .
例如,我有三个 tables,其中电缆是包含我必须使用的数据的那个,modele_cable 一个参考 table(弱实体)包含一些信息将填充视图,type_cable 是 modele_table 的弱实体,还包含一些与视图相关的信息。因此:
CREATE TABLE test.cable(
id_cable serial NOT NULL,
id_modele_cable integer,
geom geometry(MultiLineString,2154),
CONSTRAINT prk_constraint_cable PRIMARY KEY (id_cable),
CONSTRAINT fk_cable_id_modele_cable FOREIGN KEY (id_modele_cable)
REFERENCES test.modele_cable (id_modele_cable)
);
CREATE TABLE test.modele_cable(
id_modele_cable serial NOT NULL,
id_type_cable integer,
CONSTRAINT prk_constraint_modele_cable PRIMARY KEY (id_modele_cable),
CONSTRAINT fk_modele_cable_id_type_cable FOREIGN KEY (id_type_cable)
REFERENCES test.type_cable (id_type_cable)
);
CREATE TABLE test.type_cable(
id_type_cable serial NOT NULL,
nb_fo integer,
CONSTRAINT prk_constraint_type_cable PRIMARY KEY (id_type_cable)
);
CREATE VIEW public.cable_ok AS
SELECT cable.id_cable,
cable.designation,
type_cable.nb_fo,
cable.geom
FROM test.cable
LEFT JOIN test.modele_cable ON cable.id_modele_cable=modele_cable.id_modele_cable
LEFT JOIN test.type_cable ON type_cable.id_type_cable=modele_cable.id_type_cable;
我没有找到任何关于如何做我想做的事情的信息,也没有找到任何可能的信息,如果不是的话有什么解决方法。我试图制作一个触发器来检测 PostGIS 视图中的修改,并相应地更新 table 'cable',但我没有设法这样做(我只成功地创建了一次触发器之前的另一个上下文,非常痛苦)。我还注意到无法在视图的 table 内手动更新视图(这听起来合乎逻辑,因为它是一个视图)。
有没有人有任何线索、方向、帮助、经验可以帮助我解决这个问题?
UPDATE 这是我尝试实现的触发器:
create or replace function tout.update_cable_view() returns trigger as
$body$
begin
select modele_cable.id_modele_cable
into cable.id_modele_cable
from test.cable
inner join test.modele_cable on cable.id_modele_cable=modele_cable.id_modele_cable
inner join test.type_cable on modele_cable.id_type_cable=type_cable.id_type_cable,
public.cable_ok
where cable_ok.nb_fo=type_cable.nb_fo;
return null;
end;
$body$
language plpgsql;
create trigger t_update_cable_view
instead of insert or update on public.cable_ok
for each row
execute procedure tout.update_cable_view();
更新 2 这里是一个触发函数,它应该可以工作,但没有:
create or replace function tout.update_cable_view() returns trigger as
$body$
begin
update test.cable
set id_modele_cable = (select id_modele_cable from test.modele_cable
inner join test.type_cable on
modele_cable.id_type_cable=type_cable.id_type_cable
where new.nb_fo=type_cable.nb_fo and old.id_cable=new.id_cable);
return new;
end;
$body$
language plpgsql;
我找到了另一种使用规则来完成我想做的事情的方法。我的猜测是 PostgreSQL 不允许保存视图。使用 INSTEAD
规则,它不会尝试保存视图,而是更新原始的 table,然后自动更新视图。这是一段代码,用于更新:
create rule "_test_rule" as
on update to public.cable_ok
do instead update test.cable
set id_modele_cable = (select id_modele_cable from test.modele_cable
inner join test.type_cable on modele_cable.id_type_cable=type_cable.id_type_cable
where new.nb_fo=type_cable.nb_fo and new.id_cable=cable.id_cable)
where old.id_cable=cable.id_cable;
我有一个实体关系模型,我试图在其中遵守规范化规则。但是为了通过 PostGIS 进入 QGIS 并且目前只有相关数据,我想通过一些视图工作,将这些视图显示到 QGIS 中并可能根据视图中所做的修改更新相应的 table .
例如,我有三个 tables,其中电缆是包含我必须使用的数据的那个,modele_cable 一个参考 table(弱实体)包含一些信息将填充视图,type_cable 是 modele_table 的弱实体,还包含一些与视图相关的信息。因此:
CREATE TABLE test.cable(
id_cable serial NOT NULL,
id_modele_cable integer,
geom geometry(MultiLineString,2154),
CONSTRAINT prk_constraint_cable PRIMARY KEY (id_cable),
CONSTRAINT fk_cable_id_modele_cable FOREIGN KEY (id_modele_cable)
REFERENCES test.modele_cable (id_modele_cable)
);
CREATE TABLE test.modele_cable(
id_modele_cable serial NOT NULL,
id_type_cable integer,
CONSTRAINT prk_constraint_modele_cable PRIMARY KEY (id_modele_cable),
CONSTRAINT fk_modele_cable_id_type_cable FOREIGN KEY (id_type_cable)
REFERENCES test.type_cable (id_type_cable)
);
CREATE TABLE test.type_cable(
id_type_cable serial NOT NULL,
nb_fo integer,
CONSTRAINT prk_constraint_type_cable PRIMARY KEY (id_type_cable)
);
CREATE VIEW public.cable_ok AS
SELECT cable.id_cable,
cable.designation,
type_cable.nb_fo,
cable.geom
FROM test.cable
LEFT JOIN test.modele_cable ON cable.id_modele_cable=modele_cable.id_modele_cable
LEFT JOIN test.type_cable ON type_cable.id_type_cable=modele_cable.id_type_cable;
我没有找到任何关于如何做我想做的事情的信息,也没有找到任何可能的信息,如果不是的话有什么解决方法。我试图制作一个触发器来检测 PostGIS 视图中的修改,并相应地更新 table 'cable',但我没有设法这样做(我只成功地创建了一次触发器之前的另一个上下文,非常痛苦)。我还注意到无法在视图的 table 内手动更新视图(这听起来合乎逻辑,因为它是一个视图)。
有没有人有任何线索、方向、帮助、经验可以帮助我解决这个问题?
UPDATE 这是我尝试实现的触发器:
create or replace function tout.update_cable_view() returns trigger as
$body$
begin
select modele_cable.id_modele_cable
into cable.id_modele_cable
from test.cable
inner join test.modele_cable on cable.id_modele_cable=modele_cable.id_modele_cable
inner join test.type_cable on modele_cable.id_type_cable=type_cable.id_type_cable,
public.cable_ok
where cable_ok.nb_fo=type_cable.nb_fo;
return null;
end;
$body$
language plpgsql;
create trigger t_update_cable_view
instead of insert or update on public.cable_ok
for each row
execute procedure tout.update_cable_view();
更新 2 这里是一个触发函数,它应该可以工作,但没有:
create or replace function tout.update_cable_view() returns trigger as
$body$
begin
update test.cable
set id_modele_cable = (select id_modele_cable from test.modele_cable
inner join test.type_cable on
modele_cable.id_type_cable=type_cable.id_type_cable
where new.nb_fo=type_cable.nb_fo and old.id_cable=new.id_cable);
return new;
end;
$body$
language plpgsql;
我找到了另一种使用规则来完成我想做的事情的方法。我的猜测是 PostgreSQL 不允许保存视图。使用 INSTEAD
规则,它不会尝试保存视图,而是更新原始的 table,然后自动更新视图。这是一段代码,用于更新:
create rule "_test_rule" as
on update to public.cable_ok
do instead update test.cable
set id_modele_cable = (select id_modele_cable from test.modele_cable
inner join test.type_cable on modele_cable.id_type_cable=type_cable.id_type_cable
where new.nb_fo=type_cable.nb_fo and new.id_cable=cable.id_cable)
where old.id_cable=cable.id_cable;