Mysql 创建⾃增循环序列(函数实现循环,取next )
创建⾃增&循环序列(函数实现循环,取next )
前⾔
这篇⽂章是很早之前写的了,现在回过头来看,当时只是想获取主键id。现在都不⽤这种⽅式了(mybatis-plus提供 Id(),不⽌这⼀种⽅式)。
ps:⼀般来说,java尽量避免使⽤和存储过程。不流⾏了是⼀个原因,最重要的是不好调试和移植。
1:可以直接创建⾃增循环序列,但是mysql没有序列
2:mysql实现序列的⽅式:创建序列表(最少要有序列名,序列值、⾃增值),基于表创建实现序列功能
3:序列可以⼲啥–(⽇期+时间+序列)可以当做业务流⽔号,唯⼀标识。
创建表的,其中min_value和max_value可以去掉
这⾥创建的是7位⾃增循环序列,为了简单value直接从1000000(7位)开始。
function
先创建⼀个获取序列当前value的函数
在创建⼀个获取序列最⼤值的函数`CREATE TABLE `t_sequence` (  `id` bigint (21) NOT NULL COMMENT '序列号ID',  `name` varchar (100) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL COMMENT '序列名',  `value` bigint (21) NOT NULL COMMENT '序列值',  `increment` int (1) NOT NULL DEFAULT 1 COMMENT '序列⾃增值 1',  `min_value` bigint (21) NOT NULL DEFAULT 1000000 COMMENT '最⼩序列值',  `max_value` bigint (21) NOT NULL DEFAULT 9999999 COMMENT '最⼤序列值',  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',  PRIMARY KEY (`id`) USING BTREE ,  UNIQUE KEY `id` (`id`) USING BTREE ,  UNIQUE KEY `name` (`name`) USING BTREE ) ENGINE =InnoDB DEFAULT CHARSET =utf8 COLLATE =utf8_bin comment '序列表';
1
2
3
4
5
6
7mysql下载add produce
8
9
10
11
12
13CREATE FUNCTION get_seq_current (seq_name char (100)) RETURNS BIGINT  LANGUAGE SQL  DETERMINISTIC  CONTAINS SQL  SQL SECURITY DEFINER  COMMENT ''BEGIN  DECLARE current_value BIGINT ; SET current_value = 0; SELECT value into current_value FROM t
_sequence WHERE name = seq_name ; RETURN current_value ;END ;
1
2
3
4
5
6
7
8
9
10
11
12
13
最后创建⼀个获取序列下⼀个值的函数(在该函数内实现⾃增以及循环)
效果
当前的数据,序列名:base_number,当前值:9999999
使⽤函数获取当前的value,得到结果:9999999
使⽤函数获取下⼀个value,得到结果:1000000##获取最⼤value CREATE FUNCTION get_seq_ma
x (seq_name char (100)) RETURNS BIGINT  LANGUAGE SQL  DETERMINISTIC  CONTAINS SQL  SQL SECURITY DEFINER  COMMENT ''BEGIN  DECLARE max BIGINT ; SET max = 0; SELECT max_value into max FROM t_sequence WHERE name = seq_name ; RETURN max ;END ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14CREATE FUNCTION get_seq_next1(seq_name char (100)) RETURNS BIGINT  LANGUAGE SQL  DETERMINISTIC  CONTAINS SQL  SQL SECURITY DEFINER  COMMENT ''BEGIN  IF (get_seq_current (seq_name ) >= get_seq_max (seq_name ))THEN  update t_sequence SET value = min_value where name = seq_name ; ELSE  update t_sequence SET value = (value + increment ) where name = seq_name ; END IF ; RETURN get_seq_current (seq_name );END ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。