4

假设我有这张桌子:

在此处输入图像描述

我想要发生的是将列 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 

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

4

2 回答 2

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

然后步骤 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;
于 2013-06-21T08:00:21.893 回答
0

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

  • ALTER TABLE my_table ADD crea_by VARCHAR2(30);
  • ...
于 2021-06-29T13:22:16.060 回答