Oracle到MySQL数据库迁移之--主键生成策略替换
来源:互联网 发布:sql怎么安装 编辑:程序博客网 时间:2024/06/05 00:10
Oracle数据库到MySQL数据库迁移过程中的一大难题就是主键生成策略的替换. 如果之前的程序中使用Oracle的Sequence
机制来实现主键的自增的话. MySQL中需要使用TableGenerator
进行等价替换.
替换的时候, 主要有三个地方需要修改:
- 以注解方式完成hibernate映射的实体;
- 以xml方式完成hibernate映射的实体;
- 数据库存储过程;
注解方式完成hibernate映射的实体的修改
使用Oracle Sequence
假如你之前的程序使用的是Sequence
, 这里以一个名为SEQ
的Sequence
为例, 那么你操作id
字段的代码应该长的是下面这个样子:
// 注意: 如果不指定sequenceName的话, 默认为HIBERNATE_SEQUENCE, 这个序列也需要在Oracle中手动建立.@SequenceGenerator(name = "generator", sequenceName = "SEQ")@Id@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "generator")public Long getId() { return id;}
使用MySQL表模拟Oracle Sequence
首先你需要在MySQL中建立一个表sys_sequence
, 表中有两个字段, 一个是seq_name
, 代表Oracle序列的名称, 另一个是current_value
, 代表该序列的当前值(注意: 需要将此初始值设定为Oracle数据库中对应序列的当前值.). 表的样子如下:
> select * from sys_sequence;+--------------+------------+| seq_name | curr_value |+--------------+------------+| SEQ | 2809 |+--------------+------------+
. 然后在程序中如下编写:
/*** allocationSize是每次程序启动第一次插入时与之前最大值的差值.*/@Id@TableGenerator(name = "sequence", table = "sys_sequence", pkColumnName = "seq_name", valueColumnName = "curr_value", pkColumnValue = "SEQ", allocationSize = 1)@GeneratedValue(strategy = GenerationType.TABLE, generator = "sequence")private Long id;
xml方式完成hibernate映射的实体的修改
使用Oracle Sequence
之前使用Sequence
作为主键生成策略的时候, xml映射文件片段如下:
<id name="id"> <generator class="sequence"> <param name="sequence">SEQ</param> </generator></id>
使用MySQL表模拟Oracle Sequence
表的结构与前面注解方式所用的表结构相同. 这次我们在xml中使用的generator是org.hibernate.id.enhanced.TableGenerator
:
<id name="id"> <generator class="org.hibernate.id.enhanced.TableGenerator"> <param name="table_name">sys_sequence</param> <param name="segment_column_name">seq_name</param> <param name="value_column_name">curr_value</param> <param name="segment_value">SEQ</param> <param name="increment_size">1</param> </generator></id>
存储过程的修改
存储过程中, 主要涉及到Sequence
的nextval()
等方法的替换, 我们同样可以在MySQL中进行模拟.
使用Oracle Sequence
假设我们现在有一个Sequence
名为SEQ
, 那么我们通常在存储过程中使用如下函数获得SEQ
的下一个值:
SEQ.nextval
使用MySQL模拟Oracle Sequence
首先需要创建一个表格, 用于存储所有序列的名称, 当前值以及递增步长. 这里我们继续沿用前面所述的sys_sequence
表, 不过还需要为表新增一个字段increment_by
, 我们对照Oracle数据库的设置手动进行increment_by
初值的设定.
> select * from sys_sequence;+--------------+------------+--------------+| seq_name | curr_value | increment_by |+--------------+------------+--------------+| SEQ | 2809 | 1 |+--------------+------------+--------------+
然后在数据库中新增两个函数, 一个是currval
, 用于获取模拟的Sequence
的当前值:
CREATE DEFINER=`root`@`%` FUNCTION `currval`(`v_seq_name` varchar(50)) RETURNS decimal(18,0)BEGINDECLARE v_currval DECIMAL(18); SET v_currval = 1; SELECT curr_value INTO v_currval FROM sys_sequence WHERE seq_name = v_seq_name; RETURN v_currval; END
另一个是nextval
, 用户获取模拟的Sequence
的下一个值:
CREATE DEFINER=`root`@`%` FUNCTION `nextval`(`v_seq_name` varchar(50)) RETURNS decimal(18,0)BEGIN UPDATE sys_sequence SET curr_value = curr_value + increment_by WHERE seq_name = v_seq_name; RETURN currval(v_seq_name); END
之后在需要使用Sequence
的地方, 使用如下语句替代即可:
nextval('SEQ')
小结
如此一来, 就达到了利用MySQL的表来模拟Oracle的Sequence的目的. 以后每当有需要替换的序列, 都在前面建立的sys_sequence
中新增一行即可.
- Oracle到MySQL数据库迁移之--主键生成策略替换
- 数据库迁移之从oracle 到 MySQL
- 数据库迁移之从oracle 到 MySQL
- 数据库迁移之从oracle 到 MySQL
- 数据库迁移之从oracle 到 MySQL
- 数据库迁移之从oracle 到 MySQL
- 数据库迁移之从oracle 到 MySQL
- 数据库迁移之从oracle 到 MySQL
- oracle数据库迁移至mysql 之 序列替换
- Oracle数据库采用那种主键生成策略
- MySQL数据库迁移到Oracle
- 数据库迁移:mysql迁移到oracle
- 数据库主键生成策略
- 数据库主键生成策略
- 数据库主键生成策略
- 数据库主键生成策略
- kettle实现数据库迁移之oracle到mysql
- navicat实现数据库迁移之oracle到mysql
- 全面了解Nginx到底能做什么
- MySQL中的bit类型知道多少呢?
- disney (map模拟)
- DFS学习归纳总结
- 使用SQL链接服务器在不同局域网下实现数据库的数据传递
- Oracle到MySQL数据库迁移之--主键生成策略替换
- JS基础---用户注册高亮显示
- JavaWeb从入门到精通(四)-会话管理
- Android 硬编码 备注
- 图的m着色问题
- 【Linux就该这么学】在线培训第一期视频教程价值2400元
- Application传值
- JavaWeb从入门到精通(五)-JSP
- Heroku连接云端MongoDB的方法