背景

公司的表主键id使用的是mysql的自增来实现的。来看下具体创建和使用方法吧!

实现

核心思路就是使用一个表记录当前的自增的位置,步长。获取当前序列号,下一个序列号等操作使用函数来实现。但是直接改表的数据也可以,不过容易出问题。没记错的话oracle序列这个表是数据库维护的,而msql这种的实现相当于给了用户更大的自由度。

1.创建 t_sequence 自增表

DROP TABLE IF EXISTS t_sequence; 
CREATE TABLE t_sequence ( 
name VARCHAR(50) NOT NULL, 
current_value INT NOT NULL, 
increment INT NOT NULL DEFAULT 1,
remark VARCHAR(255),
PRIMARY KEY (name) 
) ENGINE=InnoDB;

2.创建取当前值的函数 t_currval

DELIMITER 后需要空一格

DROP FUNCTION IF EXISTS t_currval; 
DELIMITER $ 
CREATE FUNCTION t_currval (seq_name VARCHAR(50)) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ''
BEGIN
DECLARE value INTEGER; 
SET value = 0; 
SELECT current_value INTO value 
FROM t_sequence
WHERE name = seq_name; 
RETURN value; 
END
$ 
DELIMITER ;

3.创建取下一个值的函数 t_nextval

DROP FUNCTION IF EXISTS t_nextval; 
DELIMITER $ 
CREATE FUNCTION t_nextval (seq_name VARCHAR(50)) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ''
BEGIN
UPDATE t_sequence
SET current_value = current_value + increment 
WHERE name = seq_name; 
RETURN t_currval(seq_name); 
END
$ 
DELIMITER ;

4.创建更新当前值的函数 t_setval

DROP FUNCTION IF EXISTS t_setval; 
DELIMITER $ 
CREATE FUNCTION t_setval (seq_name VARCHAR(50), value INTEGER) 
RETURNS INTEGER
LANGUAGE SQL 
DETERMINISTIC 
CONTAINS SQL 
SQL SECURITY DEFINER 
COMMENT ''
BEGIN
UPDATE t_sequence
SET current_value = value 
WHERE name = seq_name; 
RETURN t_currval(seq_name); 
END
$ 
DELIMITER ;

5. 测试函数功能

– 当上述四步完成后,可以用以下数据设置需要创建的t_sequence名称以及设置初始值和获取当前值和下一个值。

添加一个sequence名称和初始值,以及自增幅度 添加一个名为TestSeq 的自增序列

INSERT INTO t_sequence VALUES ('TestSeq', 0, 1);

设置指定sequence的初始值 这里设置TestSeq 的初始值为10 即从哪里开始步进

SELECT T_SETVAL('TestSeq', 10);

查询指定sequence的当前值 这里是获取TestSeq当前值

SELECT T_CURRVAL('TestSeq');

查询指定sequence的下一个值 这里是获取TestSeq下一个值

SELECT T_NEXTVAL('TestSeq'); 

6.java代码中的使用

 <!-- 获取编码 -->
  <select id="getSeq" resultType="string" parameterType="java.lang.String">
    SELECT
        lpad(t_nextval(#{seqName}),8,0)
    FROM
        DUAL
  </select>

 <!-- 获取当前时间指定格式的时间字符串 -->
  <select id="getPreSixNum" resultType="string">
    select DATE_FORMAT(now(),'%y%m%d') from dual
  </select>

7. Lpad()函数

lpad函数将左边的字符串填充一些特定的字符

1.语法格式如下:

lpad(string,n,[pad_string])

参数说明:

string:   字符串或者列名。
n:        字符串总长度。如果这个值比原字符串的长度还要短,lpad函数将会把字符串截取成从左到右的n个字符;
pad_string:要填充的字符串,默认为填充空格。

2.例子

select lpad(‘tech’,7) from dual;

–将返回’ tech’

select lpad(‘tech’, 2) from dual;

–将返回’te’

select lpad(‘tech’, 8, ‘0’) from dual;

–将返回’0000tech’