Mysql下载安装:http://blog.youkuaiyun.com/yuxiangaaaaa/article/details/54018907
mysql不能像db2和Oracle那样直接create sequence 。
MySQL自增长与Oracle序列的区别:
自增长只能用于表中的其中一个字段
自增长只能被分配给固定表的固定的某一字段,不能被多个表共用.
自增长会把一个未指定或NULL值的字段自动填上.
- CREATE TABLE Test(
- id INT NOT NULL AUTO_INCREMENT,
- name VARCHAR(60) NOT NULL,
- PRIMARY KEY (id)
- ) ENGINE=InnoDB;
Oracle、DB2可以这样
- CREATE TABLE Test(
- id INT NOT NULL,
- name VARCHAR2(60) NOT NULL,
- PRIMARY KEY (id)
- );
- CREATE SEQUENCE TestSeq;
- INSERT INTO Test(id,name,released) VALUES (TestSeq.NEXTVAL,'Liruid');
下面来看一下mysql下实现sequence:
首先创建sequence表
CREATE TABLE
tbl_sequence
(
seq_name VARCHAR(50) NOT NULL,
minvalue INT NOT NULL,
maxvalue INT NOT NULL,
current_val INT NOT NULL,
increment_val INT DEFAULT '1' NOT NULL,
PRIMARY KEY (seq_name)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8;
分别对应:
seq_name-序列名称,minvalue-最小值,maxvalue-最大值,current_val-当前值,increment_val-增长步数
插入一条数据:
insert into tbl_sequence (seq_name, minvalue, maxvalue, current_val, increment_val) values ('seq_no', 1, 99999999, 1, 1);
创建function _nextval() 用于获取当前序列号
DELIMITER //
create function _nextval(name varchar(50))
returns integer
begin
declare _cur int;
declare _maxvalue int; -- 接收最大值
declare _increment int; -- 接收增长步数
set _increment = (select increment_val from tbl_sequence where seq_name = name);
set _maxvalue = (select maxvalue from tbl_sequence where seq_name = name);
set _cur = (select current_val from tbl_sequence where seq_name = name);
update tbl_sequence -- 更新当前值
set current_val = _cur + increment_val
where seq_name = name ;
if(_cur + _increment >= _maxvalue) then -- 判断是都达到最大值
update tbl_sequence
set current_val = minvalue
where seq_name = name ;
end if;
return _cur;
end;
//
DELIMITER ;
说明:
DELIMITER //修改sql执行结束标识;
当前序列达到最大值时,重新刷新到最小值开始,实现sequence循环使用。