zoukankan      html  css  js  c++  java
  • Oracle对列的操作总结

    1.更改列名

    alter table TABLE_NAME rename column COLUMN_OLD COLUMN_NEW;

    2.添加列 

    alter table TABLE_NAME add COLUMN_NAME data_type default DEFAULT_VALUE;

     3.删除列

    alter table TABLE_NAME drop column COLUMN_NAME;

    4.修改列的数据类型

    如果只是单纯的把列的长度改大,比如VARCHAR2(200)-->VARCHAR2(4000),可直接修改。

    alter table TABLE_NAME modify(COLUMN_NAME varchar2(4000));

    如果要改变该列的数据类型且该列有数据,再用上面这种方式就会报ORA-01439: column to be modified must be empty to change datatype这个ERROR,需要通过另外一种方式来解决。

    alter table TABLE_NAME add TMP_COLUMN datatype;
    update TABLE_NAME set TMP_COLUMN = COLUMN_NAME;
    alter table TABLE_NAME drop column COLUMN_NAME;
    alter table TABLE_NAME rename TMP_COLUMN to COLUMN_NAME;

    这种方法能满足需求,但是会使列名发生变化,而且字段顺序有所改变(新增字段默认添加到表末尾,有可能发生行迁移,对应用程序会产生影响)

    下面这种方式既不用使列名发生变化,也不会发生表迁移。

    alter table TABLE_NAME add TMP_COLUMN datatype;--增加临时列
    update TABLE_NAME set TMP_COLUMN = COLUMN_NAME, COLUMN_NAME = null;--将数据挪到临时列,并将该列置空
    commit;
    alter table TABLE_NAME modify COLUMN_NAME datatype;--修改该列的数据类型
    update TABLE_NAME set COLUMN_NAME = TMP_COLUMN, TMP_COLUMN = null;--将保存在临时列的数据移过来,并将临时列置空
    alter table TABLE_NAME drop column TMP_COLUMN;--删除临时列
    alter table TABLE_NAME modify COLUMN_NAME not null;--设置该列不能为空

    但是,这种方法的缺点是表要更新两次,而且当如果数据量较大时,产生的undo和redo也更多,前提也是要停机才进行操作,如果不停机 ,也可以采用在线重定义方式来做。

  • 相关阅读:
    默哀STAND SILENTLY!
    用虚拟机优化Windows(update:2008.4.24)
    UE的心情指数?
    God of War III 的发售日期?
    2009/8/15应该是一个愉快的夜晚.为林肯公园中国10月演唱会做好准备
    北京2008奥运会完美谢幕!
    《The Pursuit of Happyness / 当幸福来敲门》(2006)
    2007林肯公园上海演唱会观后感(实况像片/MP3) update:2008.1.31
    2008早上好
    Active Object C++智能指针实现
  • 原文地址:https://www.cnblogs.com/prettymdx/p/2946185.html
Copyright © 2011-2022 走看看