MYSQL数据迁徙tips,ORA-00907: missing right parenthesis

 来历:zhjjava的 Blog 作者:zhjjava的 Blog  




">

这一段时候,公司项目计划是旧数据的迁徙,从MYSQL迁徙至ORACLE,开了有数次会,商洽了多少次。

错误气象:

在从MYSQL导出sql剧本后,在oracle相关工具里执行确立表的sql时,如下,有所编削:

  CREATE TABLE TEST_TBL (
  id NUMBER (6) NOT NULL ,
  name varchar2(16) NOT NULL default '''''''',
  tel varchar2(16) NOT NULL default '''''''',
  CONSTRAINT PK_ID
  PRIMARY KEY ( id )) ;

报错:

The following error has occurred:

ORA-00907: missing right parenthesis

起头觉得莫明奇奥,已经将相关数据类型改了,还报这个错,很忧郁,糜费了足足有30分钟,搞这事,搞定后,遂想写下此文。

MYSQL ver :4.0.17,ORACLE:9i,这个标题问题与版本关系不大,只是从严谨角度停航,仍是提供一下版本.

错误原因在于:

字段定义: name varchar2(16) NOT NULL default ''''''''

oracle的create table语法:

CREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
    { column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
    | table_constraint }  [, ... ]
).....

意味着,字段给定默许值,default value 应该在[ column_constraint [, ... ] 之前,name字段定义应该是:name varchar2(16) default '''''''' NOT NULL

再看MYSQL create table的语法:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
[table_options] [select_statement]

create_definition:
  col_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]

MYSQL中的语法定义是,default_value 写在"NOT NULL/NULL"之后,固然幻想上在MYSQL里确立表时,default_value的值也可以在"NOT NULL/NULL"之前,之前之后都是有关的,都可以精确确立表,但在ORACLE中是严肃凭据语句定义来查验的,以是异样的语句(改相关字段类型后)在oracle中报错!

其他另有一点,无论是用mysqldump敕令,仍是用PHP提供的一个工具(选择导出为ORACLE格式),他们导出的表的定义SQL中,default value的位置都是在"NOT NULL/NULL"之后,而这是ORACLE相关语法不支持的,以是出现如上错误。

写出来,以防列位在这个小标题问题上糜费时候.

另有个觉得就是看标题问题我们不克不及只看表象,表里未必如一,义务如此,糊口生涯亦如此!




版权声明: 原创作品,许可转载,转载时请务必以超链接编制标明文章 原始因由 、作者信息和本声明。不然将深究法律责任。

posted @ 2011-03-07 20:01  蓝色的天空III  阅读(379)  评论(0编辑  收藏  举报