Postgresql 默认情况下,使用另一列值更新列值

Postgresql 默认情况下,使用另一列值更新列值,postgresql,function,triggers,Postgresql,Function,Triggers,我有一张像这样的桌子 + 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| + ..............

我有一张像这样的桌子

+ 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


提前感谢

如果要在更新期间更改列值或在触发器中插入“请勿使用更新”,请更改传递给触发器的新记录

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;
为了实现这一点,您需要一个触发前:

创建一个在检索过程中简单执行此操作的视图将更加高效

create view tab_name_no_null
as 
select column1, 
       column2, 
       coalesce(column3, column2) as column3
from tab_name;

对聚结的评价是廉价的。如果您在该列上进行大量搜索并希望在其上创建索引,则只需要使用触发器

触发器中的更新是危险的。改用但是不要考虑改变你的表:以表格的形式查询你的表是非常容易的:从TabLE1中选择CulnN1、Culn2、CuuleCeCuulMUN3、Culn2。下面是获得导入CSV文件的错误——错误:记录NeXT尚未被分配细节:未分配的记录的元组结构是不确定的。上下文:PL/pgSQL函数fun_gen第3行IF@stacky:抱歉,忘记添加“每行对应”选项。这只适用于行级触发器嘿,谢谢你的回答,它工作得很好,但是当我导入每个csv文件时,它跳过了第一条记录,是因为这个函数和触发器还是出于这个借口?@stacky:这一定是因为你导入数据的方式。
create view tab_name_no_null
as 
select column1, 
       column2, 
       coalesce(column3, column2) as column3
from tab_name;