Oracle到MySQL数据库迁移之--主键生成策略替换

范式迁移 | Squids DBMotion支持Oracle迁移到GaussDB GaussDB是华为自主创新研发的分布式关系型数据库。该产品具备企业级复杂事务混合负载能力,同时支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。并拥有云上高可用、高可靠、高安全,弹性伸缩、一键部署、快速备份恢复、监控告警等关键能力,能为企业提供功能全面、稳定可靠、扩展性强、性能优越的企业级数据库服务。 阅读详情

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)
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中新增一行即可.

oracle迁移mysql自增序列问题 问题说明: 今天从oracle迁移数据到mysql碰到个需求:原先的主键字段需要改成mysql中的自增字段,而且原先数据的值不能变,以后新插入的值从原先数据最大的值开始自增。 解决办法: 构建环境: mysql> CREATE TABLE test -> ( -> id INT UNSIGNED NOT NULL PRIMARY KEY, -> username VARCHAR(15) NOT NULL -> ); Query OK, 0 rows affected (0.00 sec) mysql> insert into test values(5,'t 立即下载

相关推荐

Flightmare实战:从零搭建强化学习无人机控制环境

本文详细介绍了从零开始搭建Flightmare强化学习无人机控制环境的完整流程。内容包括环境准备、核心库安装、依赖冲突解决,以及如何运行PPO算法示例进行训练与可视化测试。文章还提供了环境配置、自定义任务修改及常见问题的避坑指南,帮助开发者快速上手这一模块化的无人机RL仿真平台。

weixin_29081101的博客 356

mysql和oracle主键生成策略_Oracle到MySQL数据库迁移之--主键生成策略替换

Oracle数据库到MySQL数据库迁移过程中的一大难题就是主键生成策略的替换. 如果之前的程序中使用Oracle的Sequence机制来实现主键的自增的话. MySQL中需要使用TableGenerator进行等价替换.替换的时候,主要有三个地方需要修改:以注解方式完成hibernate映射的实体;以xml方式完成hibernate映射的实体;数据库存储过程;注解方式完成hibernate映射的...

weixin_33365244的博客 312

Microapp 接入vite子应用

MicroApp接入vite版本,干货满满,手把手步骤说明,加上报错说明,赶紧上车!

outsider76557的博客 4660

数据库的主键生成策略,你知道几种?

针对主库单点,如果有多个Master库,则每个Master库设置的起始数字不一样,步长一样,可以是Master的个数。比如:Master1 生成的是 1,4,7,10,Master2生成的是2, 5, 8, 11 Master3生成的是 3, 6, 9, 12。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。

C18298182575的博客 1352

YOLOv8 ultralytics使用笔记----labelme标记数据,训练模型、追踪目标。

Ultralytics是一个Python库,它是为执行高级计算机视觉任务而创建的,如对象检测、实例分割、图像分类等。Ultralytics为YOLO模型发布了一个全新的存储库,它被构建为用于机器视觉统一框架。这里先利用,并激活。

qq_48050838的博客 1万+

李沐之数值稳定性+模型初始化和激活函数

层记为t,这里的y不是预测,还包括了损失函数,y是优化函数,不是预测的结果y。第t层是输出。所有的h都是一些向量,向量关于向量的导数是一个矩阵,所以用了很多次的矩阵乘法,出问题就在这里。

m0_51133942的博客 1527

MySQL之主键ID生成策略

全局唯一id特点: 全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求; 趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B-tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能; 单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求; 信息安全:如果ID是连续的,恶意用户的扒取工作就非常容易做了,直接按照顺序下载指定URL即可;如果是订单号就更危险了,竞对可以直接知道我们一天的单量。所

RedStone618的博客 8123

电能质量仿真:电能质量改善措施仿真_(12).电能质量改善措施综合仿真案例

假设我们有一个微电网系统,该系统包含分布式电源(如光伏板、风力发电机)、储能设备、负荷和电网连接。电压波动:由于负荷的波动和分布式电源的间歇性输出,系统电压出现了不稳定的情况。谐波污染:非线性负荷和逆变器的运行导致系统中出现了显著的谐波污染。频率偏差:分布式电源的波动和负荷的突变导致系统频率出现了偏差。我们需要通过仿真来评估这些问题的影响,并提出相应的改善措施。

2401_87715305的博客 1360

mysql中的分库分表的主键策略

mysql中的分库分表的主键策略

荣山的博客 806

Windows11 - Ubuntu 双系统及 ROS、ROS2 安装

在本教程中,我们将使用 Ubuntu 20.04 版本,该版本使用了新的 Ubuntu 桌面安装程序,该程序将包含在今后发布的所有 Ubuntu 版本中。如果你选择了这个选项,你会看到一个简单的界面,允许你选择要安装Ubuntu的硬盘,并通过滑块来决定你希望Ubuntu使用的磁盘空间大小。如果你的电脑有多个硬盘驱动器,那么只要它们各自有自己的驱动器,这个选项就能让你在安装 Ubuntu 的同时安装现有的操作系统。在此屏幕上,系统会提示您输入您的姓名和您的计算机名称,以显示在网络上。

机器人控制与仿真应用 4509

Autosar EcuM配置-初始化及下电执行函数-基于ETAS软件

Autosar EcuM学习笔记-上电初始化执行函数及下电前执行函数,本文介绍在EcuM中的配置及使用。

赞的博客 850

主键生成策略

主键生成策略是用于在数据库表中创建新记录时生成唯一标识符(主键)的方法。

qq_52005181的博客 807

Xilinx FPGA平台DDR3设计保姆式教程(1)DDR3基础简介

xilinx平台DDR3设计(1)DDR3简介 如果我们只是拿来用ddr搬砖,那么它就简单,知道IP怎么使用就好,但是要想知其所以然,理论知识是必备的,这也是我们初学者所欠缺的东西,慢慢修炼吧! 目录 一、DDR3简介 二、地址的概念及容量计算 三、重要给概念理解 3.2 列地址脉冲选通潜伏期 3.4 掩码 四、参考资料 一、DDR3简介 DDR3全称double-data-rate 3 synchronous dynamic RAM,即第三代双倍速率同步动态随机存储器。...

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

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

Oracle数据库到MySQL数据库迁移过程中的一大难题就是主键生成策略的替换. 如果之前的程序中使用Oracle的Sequence机制来实现主键的自增的话. MySQL中需要使用TableGenerator进行等价替换.替换的时候, 主要有三个地方需要修改:以注解方式完成hibernate映射的实体;以xml方式完成hibernate映射的实体;数据库存储过程;注解方式完成hibernate映射...

weixin_28723109的博客 279

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

mysql 主键互换_Oracle到MySQL数据库迁移之--主键生成策略替换

Oracle数据库到MySQL数据库迁移过程中的一大难题就是主键生成策略的替换. 如果之前的程序中使用Oracle的Sequence机制来实现主键的自增的话. MySQL中需要使用TableGenerator进行等价替换.替换的时候, 主要有三个地方需要修改:以注解方式完成hibernate映射的实体;以xml方式完成hibernate映射的实体;数据库存储过程;注解方式完成hibernate映射...

weixin_30641597的博客 337

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

mysql logbintrustfunctioncreators_mysql转oracle

oracle转mysql总结ares-sdk初始开发测试使用的是oracle数据库,由于宁波通商的特殊需要,必须把数据库环境从oracle转向mysql。现对转换过程中出现的问题及经验总结如下:主键生成策略创建一个专门记录序列的表sequence,记录有当前序列号,序列的间隔如+1创建记录当前序列的表DROP TABLE IF EXISTS sequence;CREATE TABLE seque...

weixin_42299801的博客 247

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

oracle lob store改成mysql写法_oracle转mysql总结

oracle转mysql总结ares-sdk初始开发测试使用的是oracle数据库,由于宁波通商的特殊需要,必须把数据库环境从oracle转向mysql。现对转换过程中出现的问题及经验总结如下:主键生成策略创建一个专门记录序列的表sequence,记录有当前序列号,序列的间隔如+1创建记录当前序列的表DROP TABLE IF EXISTS sequence;CREATE TABLE seque...

weixin_39772652的博客 202

【环境部署】使用Navicat DB将数据从Oracle迁移到MySQL

0. 概述 最近一个项目在实施过程中需要将原有的Oracle数据库变更为开源的MySQL数据库。迁移宗旨:迁移过程尽量减少修改对应工作量,不能影响业务功能。通过调查分析,本次迁移主要涉及以下两方面工作: 数据库本身迁移 Java持久化业务SQL迁移 1. 数据库迁移 1.1. Navicat迁移数据表 Navicat Premium比较强大,能够连接大部分主流关系型数据库,操作方便、界面简洁,...

黑白猿的琐碎日常 1万+

mysql转oracle_MYSQL数据库迁移到ORACLE数据库

一、概述现在有个需求,想把mysql数据库中的数据转移到oracle数据库中,网上找了好几种方法,最后决定使用oracel sql developer这种工具来实现。Mysql和oracle属于两种不同的数据库,具体使用差异也有很多,不能简单使用sql文件进行导出导入。以下几个示例比较一下Mysql与oracle数据库的差异lSQL基本语法差异MySQL的SQL语句中,要求表名、表的别名必须区分大...

weixin_26789847的博客 1693

【学习笔记】【DB】Oracle数据迁移Mysql(更新中...)

好记性不如烂笔头,就算是自己做过的东西,时间久了也会有些模糊。最近在做数据库迁移,记录一下迁移过程中碰到的问题,仅作个人小结用。

故沉的博客 3885

Oracle迁移到MySQL

Oracle迁移到MySQL业务需要全面改造适配,数据库对象和业务SQL语法需要一对一映射分析如何改写,根据业务使用实际情况评估改造适配成本较高。目前,已有数据库产品能力缺少自动化迁移工具,需要依赖生态产品能力,比如云和恩墨数据迁移能力。

青龙小码农 1281

用Kettle+SQL搞定分页迁移:从Oracle到MySQL的千万级数据同步方案

本文详细介绍了如何利用Kettle(Pentaho Data Integration)结合分页SQL技术,实现从Oracle到MySQL的千万级数据高效、稳定迁移。文章重点剖析了分页迁移的核心挑战、Kettle在可视化作业和数据库支持方面的优势,并提供了针对Oracle与MySQL语法差异(如ROWNUM与LIMIT)的SQL改造方案与性能优化技巧,为大数据量表同步提供了完整的实战指南。

red88的博客 971

数据库迁移-从Oracle到MySQL

从Oracle数据库向MySQL数据库迁移中的SQL语言差异及数据库兼容性问题整理

TechRunner 8831

MySql/Oracle数据库项目改造适配信创国产数据库

国产数据库兼容性分析及迁移建议 摘要:本文对比分析了主流国产数据库(达梦、人大金仓、神通、GaussDB)与Oracle/MySQL的兼容性差异。

IT运维国产化小白的博客 1942

把orecal项目改成mysql_JAVA项目将 Oracle 转 MySQL 数据库转换(Hibernate 持久层)

项目开发时用的是Oracle数据库,但为了更好的做分布式,做集群,我们要将数据库转成 MySQL!在数据库迁移中首先要做的事是将 Oracle 的表结构以及数据 克隆到 MySQL 数据库。这点不多说,有很多工具可以实现,网上大神也给出了相应指导。重点说说后台代码:一、在 Oracle 数据库中 所有的表明、字段名都是大写,而工具将表结构转到 MySQL 之后表明名成了小写字母,而在MySQL里列...

weixin_32407987的博客 847

Oracle转MySQL日记(三) ---关于Oracle序列(Sequence)的转化

Oracle数据库可以使用序列(Sequence),而MySQL不支持序列,MySQL只支持主键自增。 方法一:序列可以直接转化为主键自增 MySQL代码如下: alter table user modify id integer auto_increment ; 其中:user为表名; id为主键 在数据库工具中也可以设置(navicat): 设置主键自增后,sql代码也要修改: 原Orac...

zjfhhc的博客 1212
上一篇: 从零构建部署Node.js+Express+Bootstrap Web应用
下一篇: Heroku连接云端MongoDB的方法
congyh
博客等级 码龄15年 43粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值