赞
踩
可能好多猿有疑惑,为什么要使用触发器,postgresql不是可以设置字段默认值吗。
首先先了解清楚字段默认值和触发器功能的区别:
1. 字段默认值:
ALTER TABLE public.so_cars_roadplans ALTER COLUMN id SET DEFAULT nextval('so_cars_roadplans_id_seq'::regclass);
好多web项目采用java SSH架构,hibernate最明显的就是实体映射,实体与表结构对应。假如我们默认值字段实体映射时,表单填值了,我们字段默认就不会生效,这个坑我当时遇到,后期就采用触发器方式解决。
2. 触发器:
触发器与字段默认模式最大的区别,就是在于时间顺序。
字段默认可以实时更新,举个例子,插入一条新纪录,实时就能根据默认值填充。
触发器执行有before和after两种:
before表示在insert、update或者delete记录之前执行,after表示在记录之后执行。
先看看postgresql触发器代码格式:
- CREATE TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name
- ON table_name
- [
- -- Trigger logic goes here....
- ];
-
- CREATE TRIGGER trigger_name AFTER INSERT ON column_name
- ON table_name
- [
- -- Trigger logic goes here....
- ];
下面针对一个触发器例子来讲解:
需求是我们要在so_cars_roadplans表中插入一条数据,同时,保证字段correlationid默认赋值uuid编码
a. 我们先使用insert语句执行新增插入数据;
b. 插入完成触发update语句,针对插入的记录,将uuid编码赋值给correlationid字段。
(1)首先创建一个名为update_roadplans_funcs的函数/过程
我们创建一个update触发器,用于修改数据
- -- Function: public.update_roadplans_funcs()
-
- -- DROP FUNCTION public.update_roadplans_funcs();
-
- CREATE OR REPLACE FUNCTION public.update_roadplans_funcs()
- RETURNS trigger AS
- $BODY$
- BEGIN
- UPDATE so_cars_roadplans SET correlationid = uuid_generate_v1() where id = NEW.ID;
- RETURN NEW;
- END;
- $BODY$
- LANGUAGE plpgsql VOLATILE
- COST 100;
- ALTER FUNCTION public.update_roadplans_funcs()
- OWNER TO postgres;
这里面有个NEW对象,表示insert记录record,注意where条件,不然就全部记录修改了。
(2)之后创建触发器TRIGGER,表示在insert之后触发update_roadplans_funcs函数/存储过程
- -- Trigger: update_roadplans_trigger on public.so_cars_roadplans
-
- -- DROP TRIGGER update_roadplans_trigger ON public.so_cars_roadplans;
-
- CREATE TRIGGER update_roadplans_trigger
- AFTER INSERT
- ON public.so_cars_roadplans
- FOR EACH ROW
- EXECUTE PROCEDURE public.update_roadplans_funcs();
(3)最后我们是用insert语句插入记录验证触发器是否生效
INSERT INTO "public"."so_cars_roadplans" ("id", "type") VALUES (351,'3');
我们看到correlationi字段uuid编码已经生成
我们的触发器功能就完全实现了,希望能帮到大家。
最后贴一些大神的触发器博文链接,供大家膜拜
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。