Oracle到mysql转换的问题总结

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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();

相关文档
最新文档