技术开发 频道

用PHP将数据从Oracle向MySQL数据迁移实作总结

  获取schema所有表

  用以下语句可以从oracle中获得schema中所有的表名

  SELECT table_name FROM user_tables

  然后可以遍历所有表向mysql进行表结构的创建与数据的迁移工作。

  获取单个表的所有字段与类型

  用以下语句可以从oracle中获得单个表的所有字段与类型

  SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT

  FROM USER_TAB_COLUMNS

  WHERE TABLE_NAME = UPPER('{$table_name}') ORDER BY column_id ASC

  这样可以得知表字段的名称,类型,长度,是否允许为空,默认值。因为oracle与mysql的字段类型并不完全兼容,故需要建立字段类型的对应关系表。  

Oracle

Mysql

number(<11)

int

number(>11)

bigint

varchar

varchar

varchar2(<255)

varchar

varchar2(>255)

text

clob

text

date

date

  获取单个表的Primary Foreign Unique Key

  用以下语句可以从oracle中获得单个表的Primary Foreign Unique Key

  SELECT C.CONSTRAINT_NAME, C.CONSTRAINT_TYPE, C.R_CONSTRAINT_NAME, C.DELETE_RULE,

  CC.COLUMN_NAME

  FROM USER_CONSTRAINTS C, USER_CONS_COLUMNS CC

  WHERE C.TABLE_NAME=upper('{$table_name}') AND C.CONSTRAINT_TYPE!='C'

  AND C.CONSTRAINT_NAME=CC.CONSTRAINT_NAME AND C.OWNER=CC.OWNER AND C.TABLE_NAME=CC.TABLE_NAME

  ORDER BY C.CONSTRAINT_TYPE, C.CONSTRAINT_NAME, CC.POSITION

  CONSTRAINT_TYPE 为 'P'则取得表的所有Primary Key ;为 'U'则取得表的所有Unique Key ;为 'R'则取得表的所有Foreign Key ;

  获取单个表的索引

  用以下语句可以从oracle中获得单个表的索引

  SELECT T.INDEX_NAME,T.COLUMN_NAME,I.INDEX_TYPE

  FROM USER_IND_COLUMNS T,USER_INDEXES I

  WHERE T.INDEX_NAME = I.INDEX_NAME AND T.TABLE_NAME = I.TABLE_NAME AND T.TABLE_NAME = UPPER('{$table_name}')

  这样可以获知表的索引名称,被索引的字段。

  将所有的表信息组装成mysql的表结构

  有了表名,字段信息,主键,Foreign, Unique.索引等信息,就可以将表结构建立起来。由于oracle没有自增字段,一个变通的方法是用primary key做为mysql中的自增字段,因为在oracle中没办法准确地知道哪个字段用到了seq来做自增,用这种方法也不是很准确。

1
相关文章