在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(); |