gpt4 book ai didi

sql - 使用触发器和插入过程将数据插入 View 时如何避免 "blank"插入?

转载 作者:行者123 更新时间:2023-11-29 14:38:10 24 4
gpt4 key购买 nike

我正在尝试通过对 PostgreSQL View 调用 insertupdate 来更新表。这是我所做的一个简化示例:

[Person] table:
id | lastname | firstname | city | age

[Person_View] table:
id | lastname | firstname | city

这是触发器和相关过程:

CREATE TRIGGER tg_update_person_view
INSTEAD OF INSERT OR UPDATE OR DELETE ON
Person_View FOR EACH ROW EXECUTE PROCEDURE update_person_view_table();

CREATE OR REPLACE FUNCTION update_person_view_table()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $function$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO Person (id, lastname, firstname)
VALUES(NEW.id, NEW.lastname, NEW.firstname);
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
UPDATE Person
SET id=NEW.id, lastname=NEW.lastname, firstname=NEW.firstname
WHERE id=OLD.id;
RETURN NEW;
END IF;
RETURN NEW;
END;
$function$;

如果我这样做:

INSERT INTO Person_View (id, city) VALUES ('3', 'Berlin')

只有 ID 的行被添加到 View 和父表。

我如何检查过程中插入值的列是否具有过程中定义的“映射”,如果没有任何映射的列,它不会继续?

最佳答案

你可以在表上定义一个检查约束,例如:

create table person(
id int primary key,
lastname text,
firstname text,
city text,
age int,
check(coalesce(lastname, firstname, city, age::text) is not null)
);

insert into person (id)
values (1);

ERROR: new row for relation "person" violates check constraint "person_check"
DETAIL: Failing row contains (1, null, null, null, null).

无论是否创建了基于该表的任何 View ,该解决方案都有效。

关于sql - 使用触发器和插入过程将数据插入 View 时如何避免 "blank"插入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129498/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com