背景
公司的表主键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’