写了一个根据当天日期生成序列号主键的一个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")) ;
下面是使用的结果:Oracle 10g修改数据库字符集Oracle Golden Gate体系架构详解相关资讯 MySQL教程
- 30分钟带你快速入门MySQL教程 (02月03日)
- MySQL教程:关于I/O内存方面的一些 (01月24日)
- CentOS上开启MySQL远程访问权限 (01/29/2013 10:58:40)
| - MySQL教程:关于checkpoint机制 (01月24日)
- MySQL::Sandbox (04/14/2013 08:03:38)
- 生产环境MySQL 5.5.x单机多实例配 (11/02/2012 21:02:36)
|
本文评论 查看全部评论 (0)