• 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资料大全
    网络协议及tcp协议详解
    QT和Java的跨平台
    QString转char *
    QT删除整个文件夹
    QT获取linux下的当前用户名
    std::map自定义类型key
    QT程序自启动
    linux下通过命令连接wifi
    Rsync实现文件的同步
  • 原文地址:https://www.cnblogs.com/prettymdx/p/2946185.html
Copyright © 2020-2023  润新知