寫了一個根據(jù)當(dāng)天日期生成序列號主鍵的一個procedure,規(guī)則為:當(dāng)天的日期加上序列號,如20120604002,表明是2012年06月04號的第2單。
具體的時間方式是通過表的策略來生成的。
生成一張管理表(用于多種主鍵生成)
1.create table sysOption (
2. keyName varchar(255),
3. value varchar(255),
4. time timestamp
5.);
然后就是使用存儲過程(結(jié)合游標(biāo)的方式) 來生成主鍵了,如下 :
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. 創(chuàng)建游標(biāo),用于查詢表中相應(yīng)的記錄。hasResult表示表中是否有記錄(如果沒有查到記錄,數(shù)據(jù)庫拋出“02000”號錯誤,這是設(shè)置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. 執(zhí)行數(shù)據(jù)庫操作,如果沒有記錄,則直接插入數(shù)據(jù)庫,并返回當(dāng)前編號,如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. 如果數(shù)據(jù)庫有記錄,則判斷日期是否為今天,如果不是今天的,則更新時間為今天,并返回今天的第一個編號,如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. 如果今天已經(jīng)有編號生成過了,那直接在原編號的基礎(chǔ)上加1,更新數(shù)據(jù)庫,然后返回編號,如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.riomediacenter.com】
服務(wù)器租用/服務(wù)器托管中國五強(qiáng)!虛擬主機(jī)域名注冊頂級提供商!15年品質(zhì)保障!--億恩科技[ENKJ.COM]
|