首页 > 代码库 > 没有increase类型的数据库中创建sequence供采番使用
没有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 );
其次,创建操作函数currval、nextval、setval
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 CREATE20 FUNCTION nextval(seq_name VARCHAR(10))21 RETURNS INTEGER22 COMMENT ‘取下一个SEQUENCE值‘23 BEGIN24 DECLARE seq_name_exits INTEGER;25 SELECT COUNT(*) INTO seq_name_exits FROM sequence WHERE name = seq_name;26 IF (seq_name_exits = 0) THEN27 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 INTEGER40 COMMENT ‘更新当前SEQUENCE值‘41 BEGIN42 UPDATE sequence43 SET current_value = value44 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 BEGIN10 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);
没有increase类型的数据库中创建sequence供采番使用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。