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

  • 相关阅读:
    CCPC2018-湖南全国邀请赛
    2019中山大学程序设计竞赛
    [POJ]poj1185 炮兵营地(状压DP)
    [CF]Codeforces Round #551 (Div. 2)
    [EOJ]2019 ECNU XCPC April Selection #1
    [现场赛]“新智认知”杯上海高校程序设计竞赛暨第十七届上海大学程序设计春季联赛
    欧拉函数 欧拉筛法 欧拉定理
    [CF]301D Yaroslav and Divisors
    岸芷汀兰的诗集(持续更新)
    模板柱(持续更新)
  • 原文地址:https://www.cnblogs.com/prettymdx/p/2946185.html
Copyright © 2011-2022 走看看