sjw*_*ond 4 postgresql triggers stored-procedures insert
假设我有一个表X,并且X有字段X1,X2并且X3。
我想要一个解决方案,每当我插入 和 的值时X1,X2都会X3通过触发器自动设置为 X1 和 X2 的总和。
这是在 mysql 中非常简单的事情,但是在 google 上一段时间后,我找不到 postgres 的一个很好的例子,只有一些关于 For every row 触发器的信息,但同样没有例子。
小智 7
创建触发函数:
create or replace function update_calc_column()
returns trigger
as
$$
begin
new.x3 := new.x1 + new.x2;
return new;
end;
$$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)
创建触发器:
create trigger calc_trigger
before insert or update on X
for each row
execute procedure update_calc_column();
Run Code Online (Sandbox Code Playgroud)
SQLFiddle: http: //sqlfiddle.com/#!15/7ed21/ 1
上面本质上是手册中示例的精简版本
http://www.postgresql.org/docs/current/static/plpgsql-trigger.html#PLPGSQL-TRIGGER-EXAMPLE
然而,像这样存储派生数据通常不是一个好主意。您应该简单地创建一个返回列 X3 的视图,该列定义为X1 + X2- 需要维护的代码少得多,而且效率更高(实际上它更高效,因为您消除了触发器开销)。
另一个(更奇特的)选项是使用 Postgres 的面向对象扩展并创建一个虚拟列:
create or replace function x3(data X) --<< yes, the type of the parameter is the name of the table
returns integer
as
$$
select data.x1 + data.x2;
$$
language sql;
Run Code Online (Sandbox Code Playgroud)
然后您可以使用:
select x.*, x.x3
from x;
Run Code Online (Sandbox Code Playgroud)
SQLFiddle: http: //sqlfiddle.com/#!15/53acf/ 1
然而,这有一个缺点,即您需要显式选择x3列。使用时不会显示x.*
| 归档时间: |
|
| 查看次数: |
1819 次 |
| 最近记录: |