mysql修改主键生成策略信息_Oracle到MySQL数据库迁移之--主键生成策略替换

本文介绍了在Oracle到MySQL数据库迁移过程中如何替换主键生成策略,特别是当原系统使用Sequence时,如何在MySQL中用TableGenerator模拟Sequence。涉及的修改包括注解方式和XML方式的Hibernate映射实体以及存储过程中的Sequence替换方法。
摘要由CSDN通过智能技术生成

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映射文件片段如下:

SEQ

使用MySQL表模拟Oracle Sequence

表的结构与前面注解方式所用的表结构相同. 这次我们在xml中使用的generator是org.hibernate.id.enhanced.TableGenerator:

sys_sequence

seq_name

curr_value

SEQ

1

存储过程的修改

存储过程中, 主要涉及到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) BEGIN DECLARE 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中新增一行即可.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值