没有increase类型的数据库中创建sequence供采番使用

对于一些没有自增长类型的数据库,要使用自增长的采番方式,一般采用自建Sequence的方法。

以MySql为例:

首先,创建一张存放数据的Sequence表

 1 DROP TABLE IF EXISTS `sequence`;
 2 CREATE TABLE `sequence` (
 3 `name` VARCHAR(10) NOT NULL COMMENT 番号种类,
 4 `current_value` INT NOT NULL COMMENT 当前值,
 5 `increment` INT NOT NULL COMMENT 递增量
 6 ) ENGINE=InnoDB DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT=采番表;
 7 
 8 ALTER TABLE `sequence` add PRIMARY KEY `PK_sequence` (
 9 `name`
10 ); 

其次,创建操作函数currvalnextvalsetval

 1 -- 取当前值的函数
 2 DROP FUNCTION IF EXISTS currval;
 3 DELIMITER $$
 4 CREATE
 5     FUNCTION currval(seq_name VARCHAR(10))
 6         RETURNS INTEGER
 7         COMMENT 取当前SEQUENCE值
 8     BEGIN
 9         DECLARE curvalue INTEGER;
10         SET curvalue = 0;
11         SELECT current_value INTO curvalue FROM sequence WHERE name = seq_name;
12         RETURN curvalue;
13     END$$
14 DELIMITER ;
15 
16 -- 取下一个值的函数
17 DROP FUNCTION IF EXISTS nextval;
18 DELIMITER $$
19 CREATE
20     FUNCTION nextval(seq_name VARCHAR(10))
21         RETURNS INTEGER
22         COMMENT 取下一个SEQUENCE值
23     BEGIN
24         DECLARE seq_name_exits INTEGER;
25         SELECT COUNT(*) INTO seq_name_exits FROM sequence WHERE name = seq_name;
26         IF (seq_name_exits = 0) THEN
27             INSERT INTO sequence (name,current_value,increment) VALUES (seq_name,100000,1);
28         END IF;
29         UPDATE sequence SET current_value = current_value + increment WHERE name = seq_name;
30         RETURN currval(seq_name);
31     END$$
32 DELIMITER ;
33 
34 -- 更新当前值的函数
35 DROP FUNCTION IF EXISTS setval;
36 DELIMITER $$
37 CREATE 
38     FUNCTION setval(seq_name VARCHAR(10), value INTEGER)
39         RETURNS INTEGER
40         COMMENT 更新当前SEQUENCE值
41     BEGIN
42         UPDATE sequence
43         SET current_value = value
44         WHERE name = seq_name;
45         RETURN currval(seq_name);
46     END$$
47 DELIMITER ;

最后,创建类似increase方法,供外部调用,此处假设为订单号,采番规则为 订单类型+年月日+每日6位连号

 1 -- 订单No采番函数
 2 DROP FUNCTION IF EXISTS getNewOrderNo;
 3 DELIMITER $$
 4 CREATE 
 5     FUNCTION getNewOrderNo(order_type varchar(10))
 6     -- order_type: CX|CP
 7         RETURNS VARCHAR(20)
 8         COMMENT 订单No采番函数
 9     BEGIN
10         DECLARE curday VARCHAR(8);
11         DECLARE seq_value VARCHAR(6);
12         SELECT date_format(now(),%Y%m%d) INTO curday;
13         SELECT LPAD(nextval(concat(order_type,curday)),6,0) INTO seq_value;
14         RETURN concat(order_type, curday, seq_value);
15     END$$
16 DELIMITER ;

初始化Sequence表数据

1 -- 订单No Sequence初期化
2 INSERT INTO sequence (name,current_value,increment) VALUES (concat(CX,date_format(now(),%Y%m%d)),100000,1);
3 INSERT INTO sequence (name,current_value,increment) VALUES (concat(CP,date_format(now(),%Y%m%d)),100000,1);

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。