移动oracle列ID

时间:2013-06-21 07:39:03

标签: sql oracle oracle11g

假设我有这张表:

enter image description here

我想要发生的是将STATUS_DT的列ID移动/更改为10,然后向下调整其余部分:

Column Name | ID

...

STAT_ID     | 10
STATUS_DT   | 10
CREA_BY     | 11
CREA_DT     | 12
LAST_UPD_BY | 13
LAST_UPD_DT | 14 

是否有单个查询(ALTER TABLE)以便我可以在不重新创建表的情况下实现此目的?

2 个答案:

答案 0 :(得分:6)

理论上,你可以

  1. 重命名要移动的列
  2. 将新列添加到列列表的末尾
  3. 将数据从旧列复制到新列
  4. 删除旧列
  5. 实际上,我会重命名旧表并使用新的列顺序重新创建它。如果需要,可以通过在线重组......

    编辑:例如:

    01 INVOICE_REQUEST_ID
       ...
    09 STAT_ID
    10 CREA_BY
    11 CREA_DT
    12 LAST_UPD_BY
    13 LAST_UPD_DT
    14 STATUS_DT
    

    然后步骤1)重命名要移动的列:

    ALTER TABLE my_table RENAME COLUMN crea_by     TO tmp_crea_by;
    ALTER TABLE my_table RENAME COLUMN crea_dt     TO tmp_crea_dt;
    ALTER TABLE my_table RENAME COLUMN last_upd_by TO tmp_last_upd_by;
    ALTER TABLE my_table RENAME COLUMN last_upd_dt TO tmp_last_upd_dt;
    
    01 INVOICE_REQUEST_ID
    ...
    09 STAT_ID
    10 TMP_CREA_BY
    11 TMP_CREA_DT
    12 TMP_LAST_UPD_BY
    13 TMP_LAST_UPD_DT
    14 STATUS_DT
    

    步骤2)将列添加到列列表的末尾:

    ALTER TABLE my_table RENAME COLUMN crea_by     TO tmp_crea_by;
    ALTER TABLE my_table RENAME COLUMN crea_dt     TO tmp_crea_dt;
    ALTER TABLE my_table RENAME COLUMN last_upd_by TO tmp_last_upd_by;
    ALTER TABLE my_table RENAME COLUMN last_upd_dt TO tmp_last_upd_dt;
    
    01 INVOICE_REQUEST_ID
       ...
    09 STAT_ID
    10 TMP_CREA_BY
    11 TMP_CREA_DT
    12 TMP_LAST_UPD_BY
    13 TMP_LAST_UPD_DT
    14 STATUS_DT
    15 CREA_BY
    16 CREA_DT
    17 LAST_UPD_BY
    18 LAST_UPD_DT
    

    步骤3)将数据从旧列复制到新列:

    UPDATE my_table 
       SET tmp_crea_by     = crea_by,
           tmp_crea_dt     = crea_dt,
           tmp_last_upd_by = last_upd_by,
           tmp_last_upd_dt = last_upd_dt;
    

    步骤4)删除旧列:

    ALTER TABLE my_table SET UNUSED (tmp_crea_by, tmp_crea_dt, tmp_last_upd_by, tmp_last_upd_dt);
    ALTER TABLE my_table DROP UNUSED COLUMNS;
    
    01 INVOICE_REQUEST_ID
       ...
    09 STAT_ID
    10 STATUS_DT
    11 CREA_BY
    12 CREA_DT
    13 LAST_UPD_BY
    14 LAST_UPD_DT
    

    如果数据不相关,您可以跳过步骤1)重命名和步骤3)复制。该脚本如下所示:

    ALTER TABLE my_table SET UNUSED (crea_by, crea_dt, last_upd_by, last_upd_dt);
    ALTER TABLE my_table ADD (crea_by     VARCHAR2(30));
    ALTER TABLE my_table ADD (crea_dt     DATE);
    ALTER TABLE my_table ADD (last_upd_by VARCHAR2(30));
    ALTER TABLE my_table ADD (last_upd_dt DATE);
    ALTER TABLE my_table DROP UNUSED COLUMNS;
    

答案 1 :(得分:0)

出现错误:“第2步)将列添加到列列表的末尾:” 命令与步骤 1 相同,它们应该是这样的:

  • ALTER TABLE my_table ADD crea_by VARCHAR2(30);
  • ...