在mysql中没有序列,所以在迁移过程中oracle得序列需要用mysql的一个表和一个函数来替换
序列
SELECT SS_SEQS.NEXTVAL FROM DUAL
替换为一个表和一个函数
表如下:
create table SS_SEQS(
idval int unsigned auto_increment,
primary key (idval)
) engine=InnoDB AUTO_INCREMENT=10000;
函数如下:
delimiter $$
create function SS_SEQS_nextval()
returns integer
contains SQL
begin
declare id long;
insert into SS_SEQS() values();
select last_insert_id() into id;
if(id=100000) then
set id=10000;
end if;
return id;
end;
$$
delimiter ;
使用方法如下即可取得序列值。
select SS_SEQS_nextval();
2012-04-28修改,解决自增长到最大值时从初始值循环增长。
上面中函数中循环判断不能使auto_increment真正从初始值10000开始重新开始。
设定auto_increment初始值语句应该是alter table SS_SEQS set auto_increment=10000;
但是这样还有一个问题,alter table放在函数中,新建函数的时候无法执行。所以重新换了个下面的方法。
表如下:
create table SS_SEQS(
idval int unsigned,
primary key (idval)
) engine=InnoDB;
Insert into SS_SEQS values(10000);
函数如下:
delimiter $$
create function SS_SEQS_nextval()
returns integer
contains SQL
begin
declare id long;
update SS_SEQS set idval=last_insert_id(idval+1);
select last_insert_id() into id;
if(id=99999) then
update SS_SEQS set idval=9999;
end if;
return id;
end;
$$
delimiter ;
使用方法如下即可取得序列值。
select SS_SEQS_nextval();
该贴由system转至本版2014-9-18 8:28:10