Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql postgres可更新视图和唯一约束_Sql_Postgresql_View - Fatal编程技术网

Sql postgres可更新视图和唯一约束

Sql postgres可更新视图和唯一约束,sql,postgresql,view,Sql,Postgresql,View,在我的简单应用程序中,我想创建一个视图,以便允许用户填充数据库的数据 这里是我的数据的一个小例子 CREATE TABLE specie ( specie_id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY, nome_comune TEXT UNIQUE, nome_scientifico TEXT UNIQUE ); CREATE TABLE rilevatore ( rilevatore_id INT PRIMARY KEY GENER

在我的简单应用程序中,我想创建一个视图,以便允许用户填充数据库的数据

这里是我的数据的一个小例子

CREATE TABLE specie
(
specie_id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
nome_comune TEXT UNIQUE,
nome_scientifico TEXT UNIQUE
);

CREATE TABLE rilevatore
(
rilevatore_id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
nome_cognome TEXT UNIQUE,
telefono INTEGER,
email TEXT,
ente_appartenenza TEXT
);

CREATE TABLE evento_investimento
(
evento_id INT PRIMARY KEY GENERATED BY DEFAULT AS IDENTITY,
data DATE,
ora TIME WITHOUT TIME ZONE,
rilevatore_id INT REFERENCES rilevatore (rilevatore_id),
specie_id INT REFERENCES specie(specie_id),
);
这是我创建的视图

CREATE VIEW investimenti_vista AS
SELECT
evento_investimento.evento_id,   
evento_investimento.ora,
evento_investimento.data,
rilevatore.nome_cognome,
rilevatore.telefono,
rilevatore.email,
rilevatore.ente_appartenenza,
specie.nome_comune,
specie.nome_scientifico
from
evento_investimento
JOIN specie ON evento_investimento.specie_id = specie.specie_id
JOIN rilevatore ON evento_investimento.rilevatore_id = rilevatore.rilevatore_id;
当我尝试填充数据时,我从postgres收到一个错误,因为从不同表生成的视图在默认情况下是不可更新的。 因此,我建议使用以下触发器来解决此问题

CREATE OR REPLACE FUNCTION inserimento_vista() RETURNS trigger AS $$
BEGIN

INSERT INTO evento_investimento (data,ora)
VALUES (NEW.data,NEW.ora);

INSERT INTO rilevatore (nome_cognome, telefono, email, ente_appartenenza)
VALUES (NEW.nome_cognome, NEW.telefono, NEW.email, NEW.ente_appartenenza);

INSERT INTO specie (nome_comune, nome_scientifico)
VALUES (NEW.nome_comune, NEW.nome_scientifico);

RETURN NEW;
END;
$$ LANGUAGE plpgsql;

create trigger inserimento_vista_trg
instead of insert on investimenti_vista for each row EXECUTE procedure inserimento_vista();
然而,由于我在rilevatore和specie表中有独特的约束,这是不起作用的。我怎样才能解决这个问题?
谢谢

您可以尝试检查是否存在如下冲突值:

CREATE OR REPLACE FUNCTION inserimento_vista() RETURNS trigger AS $$
BEGIN

INSERT INTO evento_investimento (data,ora)
VALUES (NEW.data,NEW.ora);
if not exists(select * from rilevatore where rilevatore.nome_cognome=new.nome_cognome) then
INSERT INTO rilevatore (nome_cognome, telefono, email, ente_appartenenza)
VALUES (NEW.nome_cognome, NEW.telefono, NEW.email, NEW.ente_appartenenza);
end if;

if not exists(select * from specie where specie.nome_comune=new.nome_comune) then
INSERT INTO specie (nome_comune, nome_scientifico)
VALUES (NEW.nome_comune, NEW.nome_scientifico);
end if;

RETURN NEW;
END;
$$ LANGUAGE plpgsql;   

您可能希望添加一个更新specie和/或rilevatore表,使其具有非冲突的值,但这取决于您:-)

好吧-如果您尝试插入一个具有nome_comune或nome_cognome的已存在的新记录,则会发生这些错误。如何插入记录以及预期的结果是什么?当我尝试插入违反唯一约束的新记录时,会出现这些错误,即,现有的nome_cognome(rilevatore)或nome_comune,nome_scientifico(specie)。我将使用该视图更新表evento_investmento,同时仅为新值(例如表中不存在的新nome_cognome)更新表rilevatore和specie。。在冲突上``会更有效率