oracle数据库迁移至mysql 之 序列替换_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2728 | 回复: 0   主题: oracle数据库迁移至mysql 之 序列替换        下一篇 
    本主题由 Administrator 于 2014-9-18 8:28:11 移动
xyy
注册用户
等级:新兵
经验:66
发帖:0
精华:0
注册:2012-12-18
状态:离线
发送短消息息给xyy 加好友    发送短消息息给xyy 发消息
发表于: IP:您无权察看 2014-9-17 15:19:23 | [全部帖] [楼主帖] 楼主

    在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



赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论