需求:在student
里面有一个字段update_time
,当该条记录发生变化的时候,该字段要发生相应的变化
1、student
结构如下:
1
2
3
4
5
6
7
8
9drop table if exists student; create table student( id int primary key not null, name char(10) not null, address char(50), create_time timestamp default current_timestamp, update_time timestamp default current_timestamp );
插入数据的时候,就自动生成create_time
和update_time
2、先插入几条数据
1
2
3
4insert into student(id,name,address) values(1,'小明','广州'); insert into student(id,name,address) values(2,'小红','广西'); insert into student(id,name,address) values(3,'小甜甜','湖北');
3、读取数据在表里面的情况:
1
2select * from student;
4、创建函数,用于更新update_time
1
2
3
4
5
6
7
8
9create or replace function update_timestamp() returns trigger as $$ begin new.update_time = current_timestamp; return new; end $$ language plpgsql;
函数有两个值new
和old
,我们可以从old
获得待处理的那条记录的信息,而new
则是要新生成的那条记录,下面的触发器是设置为before
,表示在那条记录发生前,这个触发器会先触发,从而执行该函数,这个函数的目的就是获得当前的时间戳,赋值到还没执行的SQL里面,相当于原先的SQL是这样的(假设更新了name
字段)update 表 set name = xx where id = xx
,经过触发器先处理后变成这样update 表 set name = xx ,update_time = 当前的时间戳 where id = xx
5、创建触发器,当student
里面的字段发生变化的时候,就会触发这个触发器
1
2
3
4create trigger auto_update_time before update on student for each row execute procedure update_timestamp();
此处除了before
,触发器还有另外两种模式,一种是After
,就是触发的SQL执行完再执行触发器的内容,After
模式下,函数就没有必要return new
,因为new
执行完了,所以在这里不能设置为After
【一开始就是设置为After,找了半天才发现】
6、更新一个字段测试一下
1
2update student set name = '媛媛' where id = 1;
7、结果如下,还可以
最后
以上就是不安鸵鸟最近收集整理的关于PostgreSQL创建触发器,实现自动更新时间戳的全部内容,更多相关PostgreSQL创建触发器内容请搜索靠谱客的其他文章。
发表评论 取消回复