怎么根据create语句修复表结构

kingstarer 2011-06-30 09:39:52
我有数据库中一批表的建表语句

现在在数据库中,这些表被人修改过,有的比原来少了一些字段,有的多了一些字段,有的在某些字段类型上发生了变化。

有没有办法根据快速地将这些表还原成create语句指定的表结构(字段多了就删字段,少了就加字段)

但这些表已经有数据了,修改表结构时要保留这些数据


如果做不到批量处理,那只有一个表的情况下怎么快速处理?

(我现在是人工处理,用desc的结果和create语句逐个字段比对并写出对应的alter语句,希望找到更好方法)
...全文
112 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
kingstarer 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kingwinerscxp 的回复:]
非完整解决方案,仅供参考!

前提:
1、数据库版本大于等于10g(主要是用到wmsys.wm_concat)
2、修改后的数据表(新表)的字段精度不能超过原来(旧表)的精度(如果发现有这种情况可以个别处理,在插入时会报错)
3、新表没有被drop掉,如果有drop掉的自行排除
4、新表如有删除的字段,则原字段不能有NULL约束

步骤:
1、建立X用户(X,Y用户可以完全互相访……
[/Quote]
这个方法似乎可行,我再好好考虑一下。有一些细节不大一样,先谢谢了。
kingstarer 2011-07-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zftang 的回复:]
有源库吗,,

2个库自动做比较用户对象

会把差异SQL自动贴出来的。
[/Quote]

具体怎么做呢? 能说得更明白一些吗?
yejihui9527 2011-07-04
  • 打赏
  • 举报
回复
alter table add( );不理报错,应该可以吧。
psufnxk2008 2011-06-30
  • 打赏
  • 举报
回复
不知道有什么好方法。。。
nsy999999 2011-06-30
  • 打赏
  • 举报
回复
我也想搞。就是有点晕
jym2002 2011-06-30
  • 打赏
  • 举报
回复
[Quote=引用楼主 kingstarer 的回复:]
我有数据库中一批表的建表语句

现在在数据库中,这些表被人修改过,有的比原来少了一些字段,有的多了一些字段,有的在某些字段类型上发生了变化。

有没有办法根据快速地将这些表还原成create语句指定的表结构(字段多了就删字段,少了就加字段)

但这些表已经有数据了,修改表结构时要保留这些数据


如果做不到批量处理,那只有一个表的情况下怎么快速处理?

(我现在是人工处理,用……
[/Quote]
用create table tb as select(你需要的列,该转化的转化) from table_name
然后再drop原表
老黎 2011-06-30
  • 打赏
  • 举报
回复

因为不管怎么样都需要手工判断那个字段是新增或删除的
这个手工活减不了
kingwinerscxp 2011-06-30
  • 打赏
  • 举报
回复
非完整解决方案,仅供参考!

前提:
1、数据库版本大于等于10g(主要是用到wmsys.wm_concat)
2、修改后的数据表(新表)的字段精度不能超过原来(旧表)的精度(如果发现有这种情况可以个别处理,在插入时会报错)
3、新表没有被drop掉,如果有drop掉的自行排除
4、新表如有删除的字段,则原字段不能有NULL约束

步骤:
1、建立X用户(X,Y用户可以完全互相访问和操作任何表
2、利用原来的建表语句在X用户下建立原来所有的表(楼主提到的“我有数据库中一批表的建表语句”)
3、将Y用户下的表数据导入到X用户下
SELECT 'insert into X.'|| a.TABLE_NAME ||' ('||wmsys.wm_concat(a.COLUMN_NAME)|| ')' || ' select '|| replace(wmsys.wm_concat(NVL(b.COLUMN_NAME,'@')),'@','NULL')||' from Y.'||a.TABLE_NAME
FROM all_tab_cols a ,all_tab_cols b
WHERE a.TABLE_NAME=b.TABLE_NAME(+)
AND a.owner='X'
AND b.owner(+)='Y'
AND a.COLUMN_NAME=b.COLUMN_NAME(+)
GROUP BY a.TABLE_NAME
4、删除Y用户下需调整的表
SELECT 'drop table Y.'||table_name||';' FROM All_Tables WHERE owner='X';
5、重建并导入Y用户需调整的表
SELECT 'create table Y.'||table_name||' as select * from X.'||table_name||';' FROM All_Tables WHERE owner='X';
6、删除X
drop user X;
秋雨飘落 2011-06-30
  • 打赏
  • 举报
回复
有源库吗,,

2个库自动做比较用户对象

会把差异SQL自动贴出来的。
Well 2011-06-30
  • 打赏
  • 举报
回复
不知道有什么方法。。。应该不行吧。。除非你在建库的时候,在create那时对数据库进行全库备份了。。
kingstarer 2011-06-30
  • 打赏
  • 举报
回复
有没有什么方法能自动识别呢

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧