MySql 运用存储过程实现主键生成

写了一个根据当天日期生成序列号主键的一个procedure,规则为:当天的日期加上序列号,如20120604002,表明是2012年06月04号的第2单。

具体的时间方式是通过表的策略来生成的。

生成一张管理表(用于多种主键生成)

create table sysOption (
  keyName varchar(255),
  value varchar(255),
  time timestamp
);


然后就是使用存储过程(结合游标的方式) 来生成主键了,如下 :

drop procedure if exists genRecordNum;  

delimiter //
CREATE PROCEDURE genRecordNum()
BEGIN
  declare rn varchar(255) default null;
  declare v_value varchar(255) default null;
  declare v_time timestamp default null;
  
  DECLARE hasResult INTEGER DEFAULT 1;
  
  declare genCursor CURSOR FOR select value, time from sysOption where keyName='genRecordNum'; 
  declare CONTINUE HANDLER FOR SQLSTATE '02000' SET hasResult = 0; 
  
  OPEN genCursor;
  FETCH genCursor INTO v_value, v_time;  
  CLOSE genCursor;

  
  if hasResult=0 then 
	   insert into sysOption values('genRecordNum', '1', now());
	   set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad('1', 3, '0')) ;
  else
  		if date_format(v_time, '%Y%m%d')!=date_format(now(), '%Y%m%d') then
  	   		update sysOption set value='1', time = now();
  	   		set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad('1', 3, '0')) ;
  	   	else
  	   		update sysOption set value=1+v_value;
  	   		set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad(1+v_value, 3, '0')) ;
  	   	end if;
  end if;   
  
  select rn recordNum;
END;//
delimiter ;

存储过程的理解:

1. 创建游标,用于查询表中相应的记录。hasResult表示表中是否有记录(如果没有查到记录,数据库抛出“02000”号错误,这是设置hasResult为0)

  declare genCursor CURSOR FOR select value, time from sysOption where keyName='genRecordNum'; 
  declare CONTINUE HANDLER FOR SQLSTATE '02000' SET hasResult = 0; 
  

2. 执行数据库操作,如果没有记录,则直接插入数据库,并返回当前编号,如20120604001;

 if hasResult=0 then 
	   insert into sysOption values('genRecordNum', '1', now());
	   set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad('1', 3, '0')) ;
3. 如果数据库有记录,则判断日期是否为今天,如果不是今天的,则更新时间为今天,并返回今天的第一个编号, 如20120604001;

if date_format(v_time, '%Y%m%d')!=date_format(now(), '%Y%m%d') then
  	   		update sysOption set value='1', time = now();
  	   		set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad('1', 3, '0')) ;
4. 如果今天已经有编号生成过了,那直接在原编号的基础上加1,更新数据库,然后返回编号, 如20120604002:

else
  	   		update sysOption set value=1+v_value;
  	   		set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad(1+v_value, 3, '0')) ;

下面是使用的结果:





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值