postgresql触发器实例

 

可能好多猿有疑惑,为什么要使用触发器,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编码已经生成

我们的触发器功能就完全实现了,希望能帮到大家。

最后贴一些大神的触发器博文链接,供大家膜拜

https://www.yiibai.com/postgresql/postgresql-trigger.html

https://blog.csdn.net/neo_liu0000/article/details/6255623

你可能感兴趣的:(postgresql,数据库)