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

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

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

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')) ;

下面是使用的结果:

1338789283_8495.jpg

分享到:

18e900b8666ce6f233d25ec02f95ee59.png

72dd548719f0ace4d5f9bca64e1d7715.png

2012-06-04 13:53

浏览 559

评论

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值