postgresql - 默认情况下用另一个列值更新一个列值

标签 postgresql function triggers

我有一张 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/

相关文章:

sql - Postgres 触发器更新另一个表中的计数器不起作用

SQL查找子项匹配多行的父项

sql - 我可以为多个列添加别名吗?如何?

postgresql - 错误 : parent directory is world writable but not sticky MAC

Python - 查找字符串中的所有非字母数字字符

mysql - 如果字段已经存在则触发 MySQL 增量

sql - 将 PostgreSQL 函数包装在另一个函数中以有条件地组合结果

JavaScript 破坏性 map 函数

c - 'sizeof (function name)' 返回什么?

mysql - 如何创建触发器来更新 MySQL 中的时间戳?