注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无线时代辐射无穷

抓紧生宝宝,小心辐射

 
 
 

日志

 
 

PostgreSQL中的序列Sequence,存储过程Procedure和触发器Trigger  

2011-05-11 12:09:59|  分类: postgres |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1、序列:
PostgreSQL 支持 SERIAL 数据类型。它在字段上自动创建一个序列和索引。例如:
CREATE TABLE person (
  id   SERIAL,
  name TEXT
);

会自动转换为:
CREATE SEQUENCE person_id_seq;
CREATE TABLE person (
  id   INT4 NOT NULL DEFAULT nextval('person_id_seq'),
  name TEXT
);

如果要在存储过程或trigger里面使用,只需在插入之前先用函数 nextval() 从序列对象里检索出下一个 SERIAL 值,然后再显式插入。可用伪码这样描述:

new_id = execute("SELECT nextval('person_id_seq')");
execute("INSERT INTO person (id, name) VALUES (new_id, 'Blaise Pascal')");

这样还能在其他查询中使用存放在 new_id 里的新值(例如,作为 person 表的外键)。 注意自动创建的 SEQUENCE 对象的名称将会是 <table>_<serialcolumn>_seq, 这里 table 和 serialcolumn 分别是你的表的名称和你的 SERIAL 字段的名称。

类似的,在 SERIAL 对象缺省插入后你可以用函数 currval() 检索 刚赋值的 SERIAL 值,例如:

execute("INSERT INTO person (name) VALUES ('Blaise Pascal')");
new_id = execute("SELECT currval('person_id_seq')");

2、存储过程和触发器

 先创建个触发器函数
CREATE OR REPLACE FUNCTION trfor100w()
  RETURNS trigger AS
$BODY$
    DECLARE
       rowcounts integer;
    BEGIN
IF TG_OP='INSERT' THEN
     select count(*) into rowcounts from tablename;
            --tablename替换为你需要测试是否有100W条数据的表名

     IF rowcounts >= 1000000 THEN
               --这里执行一个删除最老一条的数据的语句
               --我不知道你数据表的结构,这个不好写,
               --你自己写下,直接写入sql语句就可,别忘了
               --最后要加分号,比如
               -- delete * from xxx;
     END IF;
     return NEW;
        END IF;
    END;
$BODY$
  LANGUAGE plpgsql VOLATILE;
之后再正式创建触发器
CREATE TRIGGER tg_trfor100w
  BEFORE INSERT
  ON tablename
  FOR EACH ROW
  EXECUTE PROCEDURE trfor100w();

3、触发器测试,实现再insert之前,自动查找sequence的值,并赋给id主键,当然也可以采用serial的方式实现,就不需要触发器和存储过程了。

drop sequence test_user_id_seq;
create sequence test_user_id_seq;

drop table test_user cascade;
create table test_user (
id int8 not null,
user_name varchar(50) not null,
nick_name varchar(50) not null,
signature varchar(100) not null,
sex int4 not null default 0,
kind int4 not null,
primary key(id)
);

delete from test_user;

insert into test_user (id,USER_NAME, NICK_NAME, SIGNATURE, sex, KIND)
values (1,'hanweisha1119', '小包包', '恰将春风当秋风,又看闲花如流水', 1, 1);


insert into test_user (USER_NAME, NICK_NAME, SIGNATURE, sex, KIND)
values ('hanweisha1119', '小包包', '恰将春风当秋风,又看闲花如流水', 1, 1);

 

drop trigger t_before_tb_user_id on test_user ;
drop FUNCTION p_before_tb_user_id();


CREATE OR REPLACE FUNCTION p_before_tb_user_id() RETURNS trigger AS $$
declare
 v_sequence_id integer;
BEGIN
  SELECT INTO v_sequence_id nextval('test_user_id_seq');
  NEW.id = v_sequence_id;
 return NEW;
END;
$$
  LANGUAGE plpgsql VOLATILE;
 
create trigger t_before_tb_user_id before insert on test_user for each row execute procedure p_before_tb_user_id();

4、存储过程的执行,采用select语句调用即可
select function_name();

  评论这张
 
阅读(1408)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017