始创于2000年 股票代码:831685
咨询热线:0371-60135900 注册有礼 登录
  • 挂牌上市企业
  • 60秒人工响应
  • 99.99%连通率
  • 7*24h人工
  • 故障100倍补偿
您的位置: 网站首页 > 帮助中心>文章内容

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

发布时间:  2012/7/27 17:24:24

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

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

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

1.create table sysOption (  
2.  keyName varchar(255),  
3.  value varchar(255),  
4.  time timestamp  
5.); 
然后就是使用存储过程(结合游标的方式) 来生成主键了,如下 :

1.drop procedure if exists genRecordNum;    
2.  
3.delimiter //  
4.CREATE PROCEDURE genRecordNum()  
5.BEGIN  
6.  declare rn varchar(255) default null;  
7.  declare v_value varchar(255) default null;  
8.  declare v_time timestamp default null;  
9.    
10.  DECLARE hasResult INTEGER DEFAULT 1;  
11.    
12.  declare genCursor CURSOR FOR select value, time from sysOption where keyName='genRecordNum';   
13.  declare CONTINUE HANDLER FOR SQLSTATE '02000' SET hasResult = 0;   
14.    
15.  OPEN genCursor;  
16.  FETCH genCursor INTO v_value, v_time;    
17.  CLOSE genCursor;  
18.  
19.    
20.  if hasResult=0 then   
21.       insert into sysOption values('genRecordNum', '1', now());  
22.       set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad('1', 3, '0')) ;  
23.  else  
24.        if date_format(v_time, '%Y%m%d')!=date_format(now(), '%Y%m%d') then  
25.            update sysOption set value='1', time = now();  
26.            set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad('1', 3, '0')) ;  
27.        else  
28.            update sysOption set value=1+v_value;  
29.            set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad(1+v_value, 3, '0')) ;  
30.        end if;  
31.  end if;     
32.    
33.  select rn recordNum;  
34.END;//  
35.delimiter ; 
存储过程的理解:

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

1.declare genCursor CURSOR FOR select value, time from sysOption where keyName='genRecordNum';   
2.declare CONTINUE HANDLER FOR SQLSTATE '02000' SET hasResult = 0;  
2. 执行数据库操作,如果没有记录,则直接插入数据库,并返回当前编号,如20120604001;

1.if hasResult=0 then   
2.   insert into sysOption values('genRecordNum', '1', now());  
3.   set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad('1', 3, '0')) ;  3. 如果数据库有记录,则判断日期是否为今天,如果不是今天的,则更新时间为今天,并返回今天的第一个编号,如20120604001;
1.if date_format(v_time, '%Y%m%d')!=date_format(now(), '%Y%m%d') then  
2.            update sysOption set value='1', time = now();  
3.            set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad('1', 3, '0')) ;  4. 如果今天已经有编号生成过了,那直接在原编号的基础上加1,更新数据库,然后返回编号,如20120604002:
1.else  
2.            update sysOption set value=1+v_value;  
3.            set rn = CONCAT(date_format(now(), '%Y%m%d'), lpad(1+v_value, 3, '0')) ; 
 


本文出自:亿恩科技【www.enkj.com】

服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM]

  • 您可能在找
  • 亿恩北京公司:
  • 经营性ICP/ISP证:京B2-20150015
  • 亿恩郑州公司:
  • 经营性ICP/ISP/IDC证:豫B1.B2-20060070
  • 亿恩南昌公司:
  • 经营性ICP/ISP证:赣B2-20080012
  • 服务器/云主机 24小时售后服务电话:0371-60135900
  • 虚拟主机/智能建站 24小时售后服务电话:0371-60135900
  • 专注服务器托管17年
    扫扫关注-微信公众号
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 亿恩科技 版权所有  地址:郑州市高新区翠竹街1号总部企业基地亿恩大厦  法律顾问:河南亚太人律师事务所郝建锋、杜慧月律师   京公网安备41019702002023号
      0
     
     
     
     

    0371-60135900
    7*24小时客服服务热线