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