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。。在冲突上``会更有效率