我有一张 table
+ Column1 | Column2 | Column3 +
+---------|---------|---------+
+ 1 | val.txt | val.txt +
+ 2 | test.xls| test.xls+
+ 3 | abc.dwg | abc.dwg +
+ 4 | y.txt | y.txt +
+ 5 | kylk.txt| +
...............................
+---------|---------|---------+
现在当第 3 列中有一个空值时,默认情况下它应该添加第 2 列的值,这可以在具有默认条件的同一表列中完成吗?
创建函数和触发器的想法和 我尝试创建一个函数但失败了。
CREATE OR REPLACE FUNCTION fun_gen()
RETURNS trigger AS
$BODY$BEGIN
update public.tab_name
set column3=column2
where column3 is null;
END$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
有没有办法给表格列本身一个默认条件或者如何解决它的函数和触发器 我在 centos 7 中使用 postgres 9.4。
提前致谢
最佳答案
如果您想在更新或插入期间更改列值,请不要在触发器中使用UPDATE
,更改NEW
记录被传递给触发器。
CREATE OR REPLACE FUNCTION fun_gen()
RETURNS trigger AS
$BODY$
BEGIN
if new.column3 is null then
new.column3 := new.column2;
end if;
return new;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
为了完成这项工作,您需要一个before
触发器:
create trigger tab_name_trigger
BEFORE update or insert on tab_name
for each row
execute procedure fun_gen();
创建一个在检索期间简单地执行此操作的 View 会很多更有效率。
create view tab_name_no_null
as
select column1,
column2,
coalesce(column3, column2) as column3
from tab_name;
coalesce()
的评估很便宜。如果您在该列上进行大量搜索并希望在其上创建索引,那么唯一需要触发器的情况。
关于postgresql - 默认情况下用另一个列值更新一个列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43933324/