写了一个根据当天日期生成序列号主键的一个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')) ;
下面是使用的结果: