1、Mysql不支持直接的Sequence,首先需要创建一张表来模拟Sequence的功能。
CREATE TABLE t_sequence(
seq_name varchar(100) NOT NULL COMMENT '主键',
table_name varchar(100) NOT NULL COMMENT '表名标识该序列是某张表的',
column_name varchar(200) NOT NULL COMMENT '列名标识该序列用于某个字段',
current_val int(15) NOT NULL COMMENT '当前值',
increment_val int(5) NOT NULL DEFAULT '1' COMMENT '跨度',
valid_flag varchar(1) NOT NULL DEFAULT 'Y' COMMENT 'Y有效N无效',
create_by varchar(100) NOT NULL DEFAULT 'admin' COMMENT '创建人',
create_date datetime NOT NULL COMMENT '创建时间',
update_by varchar(100) NOT NULL DEFAULT 'admin' COMMENT '修改人',
update_date datetime NOT NULL COMMENT '修改时间',
PRIMARY KEY (`seq_name`)
) COMMENT='序列表';
2、创建一个取当前值的函数
CREATE FUNCTION fun_currval(v_seq_name varchar(100)) RETURNS int(15)
COMMENT '用于获取序列表中的值'
begin
declare
value int(15);
set value = 0;
select current_val into value from t_sequence where seq_name=v_seq_name;
return value;
end;
3、创建一个取下一个值的函数
CREATE FUNCTION fun_nextval(v_seq_name varchar(100),update_by varchar(100)) RETURNS int(15)
COMMENT '用于获取序列表中的值'
begin
update t_sequence set current_val=current_val+increment_val,update_date=now(),update_by=update_by where seq_name=v_seq_name;
return fun_currval(v_seq_name);
end;
4、测试函数的功能
例如:给t_user表的主键user_id增加一个序列seq_user_id,从0开始,每次自增1。
--插入一条配置语句
INSERT INTO t_sequence VALUES ('seq_user_id', 't_user', 'user_id', '1', '1', 'Y', 'admin', now(), 'admin', now());
--获取序列下一值。(这里第二个参数实际中可忽略。建表时可删掉该字段。本人主要是考虑执行update语句时一定要有update_by)。然后在Java代码中直接调用执行这一段sql即可得到序列值。
select fun_nextval('seq_user_id','admin')