移动oracle列ID

Chr*_*ark 3 sql oracle oracle11g

假设我有这个表:

在此输入图像描述

我想要发生的是将列id移动/更改STATUS_DT为10并向下调整其余部分,如下所示:

Column Name | ID

...

STAT_ID     | 10
STATUS_DT   | 10
CREA_BY     | 11
CREA_DT     | 12
LAST_UPD_BY | 13
LAST_UPD_DT | 14 
Run Code Online (Sandbox Code Playgroud)

是否有一个查询(ALTER TABLE),以便我可以实现这一点而无需重新创建表?

wol*_*lφi 7

从理论上讲,你可以

  1. 重命名要移动的列
  2. 将新列添加到列列表的末尾
  3. 将数据从旧列复制到新列
  4. 放下旧栏目

在实践中,我将重命名旧表并使用新的列顺序重新创建它.如果需要,可以通过在线重组...

编辑:例如:

01 INVOICE_REQUEST_ID
   ...
09 STAT_ID
10 CREA_BY
11 CREA_DT
12 LAST_UPD_BY
13 LAST_UPD_DT
14 STATUS_DT
Run Code Online (Sandbox Code Playgroud)

然后步骤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
Run Code Online (Sandbox Code Playgroud)

步骤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
Run Code Online (Sandbox Code Playgroud)

步骤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;
Run Code Online (Sandbox Code Playgroud)

步骤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
Run Code Online (Sandbox Code Playgroud)

如果数据不相关,则可以跳过步骤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;
Run Code Online (Sandbox Code Playgroud)