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也更多,前提也是要停机才进行操作,如果不停机 ,也可以采用在线重定义方式来做。

  • 相关阅读:
    Qt's Undo Framework
    linux-ftp
    Linux Terminator
    linux wc
    Linux卷配置管理
    vmware workstation LINUX磁盘扩容
    Oracle linux6.1配置yum本地源
    安装jdk java -version 不是自己所需要的版本
    aix下oracle数据库创建表空间和用户
    Linux命令 find和mv的结合使用:查找文件,移动到某个目录
  • 原文地址:https://www.cnblogs.com/prettymdx/p/2946185.html
Copyright © 2011-2022 走看看