Oracle到mysql转换的问题总结
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Oracle到mysql转换的问题总结
常用字段类型区别
个别语句写法区别
1.oracle里只可以用单引号包起字符串,mysql里可以用双引号和单引号。
2.mysql 在select * from () ....,from后面是一个结果集时,括号后面必须加上别名。
3.mysql在delete数据时不能给表加别名,如:delete from table1 T where....,会报错,但是可以这样写:delete T from table1 T where....。
4.Mysql不支持在同一个表中先查这个表在更新这个表,举个例子说明一下,
insert into table1values(字段1,(select 字段2 from table1where...)),但是可以在后面那个table1加上别名就没有问题了。
insert into table1values(字段1,(select T.字段2 from table1T where...))5.MYSQL有自动增长的数据类型,插入记录时不用操作此字段,会自动获得数据值。ORACLE没有自动增长的数据类型,需要建立一个自动增长的序列号,插入记录时要把序列号的下一个值赋于此字段。也可以自定义函数实现oracle的nextval。
6.翻页的sql语句处理,MYSQL处理翻页的SQL语句比较简单,用LIMIT 开始位
置, 记录个数,例如:select * from table limit m,n,意思是从m+1开始取n
条。
常见的函数替换
例子:
Oracle:select decode(a,b,c,d) as col1 from table1;
Mysql:select
case
when a=b then c
when a!=b then d
end as col1
from table1
3.oracle的函数ROW_NUMBER() OVER(PARTITION BY col1 ORDER BY col2),根据col1分组,在分组内根据col2排序,改函数计算的值就表示每组内部排序后的顺序编号。
Mysql没有这个函数,可以用mysql的用户变量来实现
例子:
Oracle:select row_number() over(partition by col1 order by col2) as num from table1 Mysql:select num1 as num from (select if(@pdept=col1,@rank:=@rank+1,@rank:=1) as num1,@pdept:=col1 from table1 order by col2 ) H
这里用到mysql的用户变量。
4.oracle的行号ROWNUM,mysql没有这个行号,也需要用用户变量来实现。
例子:
Oracle:select * from table1 where rownum - col1=0
Mysql: select * from table1,(SELECT (@rowNum := 0)) HH where (@rowNum := @rowNum + 1) - col1=0
5.Oracle 中的substr (hello,a,b)mysql中是substring (hello,a,b) oracle的a=0和a=1是一样的,都是从第一个开始。Mysql 是从0开始。
6.Oracle的nvl()对应mysql的ifnull()。
7.Oracle 中的WMSYS.WM_CONCAT(),列转行函数,以逗号隔开,mysql 可以用GROUP_CONCAT()进行替换。
8.Oracle的||可以用mysql的+替代,但是mysql在往某列加上字符时应该用concat,例如给表中name字段加上x:update table1 set name=concat(x,name)。
1.1 移植过程中重点问题
1.1.1 数据类型差异
ORACLE数据库和MYSQL数据库在数据类型方面差异比较大,而且数据类型也是一个数据库存储数据的基础,所以找到数据类型之间的对应是整个系统进行移植的基础。以下给出了ORACLE à MYSQL数据类型的对应关系。
数值类型:
NUMBER à DECIMAL,精度刻度都不变
注:如果是序列用BIGINT
字符串类型:
VARCHAR2 à VARCHAR长度不变。
LONG à LONGTEXT
这里有可能遇到的问题是超过主键key长度的问题,根据实际情况适当修改,如果是TEXT类型也需要指名长度,否则建立key会报错
日期类型:
DATE à DATETIME
TIMESTAMP(N) à TIMESTAMP
1.1.2 SQL语法差异
SEQUENCE:
MYSQL没有ORACLE中的SEQUENCE对象,我们在迁移的时候需要特别注意,一般SEQUENCE有两种用途:
1、作为表中自增字段的序列号。
2、程序中获得自动编号。
MYSQL数据类型中存在 AUTO_INCREMENT为自增数据类型。我们可以利用该数据类型变通一下来满足我们现有系统中的SEQUENCE功能。
1、对于ORACLE中SEQUENCE作为表的自增列一般是通过与触发器绑定实现的,在MYSQL中我们可以直接利用MYSQL的AUTO_INCREMENT类型来实现。
2、 ORACLE开发的应用程序中直接SELECT SEQUENCT来获得自动编号,对于这个功能我们也可以利用MYSQL的AUTO_INCREMENT类型来实现。
首先介绍一个函数,我们可以利用如下函数查询最后一个序列号的值:
mysql> SELECT LAST_INSERT_ID();