记一次oracle数据库迁移至mysql数据库(表同步)

目录

一、利用Navicat将oracle迁移至mysql数据库

1、建立数据传输

2、选择需要迁移的数据库跟目标库

3、数据传输选项

4、选择需要迁移表信息

二、迁移之后遇到的一些问题

1、大小写问题

2、数据库函数问题

3、sql语句是否使用空格隔开问题

4、关于子查询别命名问题

5、数据库自增问题


由于近期一部分项目的测试环境需要从oracle迁移至mysql,所以做了一下数据库表的迁移,其中也遇到了一些问题,因此记录一下

一、利用Navicat将oracle迁移至mysql数据库

1、建立数据传输

2、选择需要迁移的数据库跟目标库

3、数据传输选项

4、选择需要迁移表信息

选好需要同步的表之后点击开始即可

二、迁移之后遇到的一些问题

1、大小写问题

由于oracle不区分大小写,所以同步过来的表及字段我默认为全部大写,但是在系统中表名并不是全部大写,比如一个mysqlTest表,数据库中是MYSQLTEST,但是程序中的sql是 SELECT * FROM mysqlTest,那就会报错mysqlTest表不存在,因此需要设置mysql不区分大小写。

进入mysql的my.cnf目录下,比如/etc/my.cnf,然后在后边加上 lower_case_table_names=1

复制代码
lower_case_table_names=1

然后重启mysql即可。

2、数据库函数问题

比如一些 Unknown column 'sysdate' in 'where clause' ,oracle使用sysdate来取当前时间,mysql则需要加括号sysdate(),或者使用 CURRENT_TIMESTAMP(),包括其他截取,分页(limit跟rownum)等就不赘述

3、sql语句是否使用空格隔开问题

oracle中使用以下语句 ,可以正常查询,但是在mysql中则会报错

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a.age<21' at line 1

sql 复制代码
SELECT * from test a WHERE a.id>10and a.age<21  ;

在10和and之间加一个空格即可解决

sql 复制代码
SELECT * from test a WHERE a.id>10 and a.age<21  ;

4、关于子查询别命名问题

比如分页的时候可以这样查询总数,oracle可以正常返回,mysql则会报错

> 1248 - Every derived table must have its own alias

sql 复制代码
SELECT count(*) FROM(SELECT * from  test );

需要给子查询加一个别命名

sql 复制代码
SELECT count(*) FROM(SELECT * from  test ) a;

5、数据库自增问题

oracle中可以使用序列号自增,select SEQ_TESTNO.nextVal from dual ;在使用的时候可以直接获取到序列号的值,但是mysql中则不能直接使用,会报错 Unknown table 'SEQ_TESTNO' in field list,为了减小改动量就建一个表用来保存序列号,然后写一个获取下一个序列号的函数,用来获取。

建表

sql 复制代码
CREATE TABLE `sequence` (
  `name` varchar(255) COLLATE utf8_bin NOT NULL COMMENT '序列号名称',
  `current_value` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '当前值',
  `increment` varchar(255) COLLATE utf8_bin DEFAULT NULL COMMENT '增长量',
  PRIMARY KEY (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

获取当前值

sql 复制代码
DROP FUNCTION IF EXISTS currval; 
DELIMITER $ 
CREATE FUNCTION currval (seq_name VARCHAR(50)) 
     RETURNS INTEGER 
     LANGUAGE SQL 
     DETERMINISTIC 
     CONTAINS SQL 
     SQL SECURITY DEFINER 
     COMMENT '' 
BEGIN 
     DECLARE value INTEGER; 
     SET value = 0; 
     SELECT current_value INTO value 
          FROM sequence 
          WHERE name = seq_name; 
     RETURN value; 
END
$ 
DELIMITER ;

获取下一个值

sql 复制代码
DROP FUNCTION IF EXISTS nextval; 
DELIMITER $ 
CREATE FUNCTION nextval (seq_name VARCHAR(50)) 
     RETURNS INTEGER 
     LANGUAGE SQL 
     DETERMINISTIC 
     CONTAINS SQL 
     SQL SECURITY DEFINER 
     COMMENT '' 
BEGIN 
     UPDATE sequence 
          SET current_value = current_value + increment 
          WHERE name = seq_name; 
     RETURN currval(seq_name); 
END 
$ 
DELIMITER ; 

插入序列号名称

查询的时候只需要

SELECT NEXTVAL('SEQ_TESTNO') from dual; 即可

相关推荐
MacroZheng4 分钟前
完美替代 Navicat!这款内置 AI 的数据库工具,太香了!
java·后端·mysql
ACP广源盛1392462567317 分钟前
Qwen3.8‑2.4T 开源落地@ACP#国产 MoE 大模型私有化部署中 MST 多屏转换芯片 GSV2231 硬件价值与应用场景
大数据·数据库·人工智能·嵌入式硬件
java_logo17 分钟前
Docker 部署 openGauss:轻松搭建企业级开源关系型数据库平台
数据库·docker·开源·opengauss·轩辕镜像·opengauss部署教程·opengauss部署文档
旺仔学长 哈哈27 分钟前
52486|高校专业评估不再靠表格:Spring Boot 本科专业质量评估管理系统实战
数据库·spring boot·毕业设计·教育管理
梦想的旅途21 小时前
企业微信Webhook回调怎么做自动回复和AI客服
数据库·机器人·自动化·企业微信·rpa
Zguigo1 小时前
OCR 核心原理 + 模型 + 检测与识别
数据库·ocr
凤山老林1 小时前
零停机数据库演进:Spring Boot 集成 Flyway 与平滑DDL变更策略
数据库·spring boot·后端
曹牧2 小时前
Oracle:取固定分隔符字符串中第一个元素
数据库·oracle
szarron2 小时前
VNA6 便携式矢量网络分析仪:从入门到精通
数据库·嵌入式硬件·测试工具·5g·射频工程
没文化的阿浩2 小时前
【MySQL】数据类型
android·mysql·adb