来历: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相关语法不支持的,以是出现如上错误。
写出来,以防列位在这个小标题问题上糜费时候.
另有个觉得就是看标题问题我们不克不及只看表象,表里未必如一,义务如此,糊口生涯亦如此!
版权声明:
原创作品,许可转载,转载时请务必以超链接编制标明文章 原始因由 、作者信息和本声明。不然将深究法律责任。