如何在Oracle中的特定位置插入列而不删除和重新创建表?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

我有一个特定的场景,我必须在Oracle的现有表中插入两个新列。我无法做到丢弃和重新创建表格。那么可以通过什么方式来实现?

提问于
用户回答回答于

一旦创建表格,我不相信你可以在表格的最后添加一列。一种解决方案可能是尝试这一点:

CREATE TABLE MY_TEMP_TABLE AS
SELECT *
FROM TABLE_TO_CHANGE;

删除要添加列的表格:

DROP TABLE TABLE_TO_CHANGE;

现在,您可以从头开始重建现有表格,并在您希望的列中添加。我们假设这个练习需要添加名为“COL2和COL3”的列。

现在将数据重新插入新表格中:

INSERT INTO TABLE_TO_CHANGE (COL1, COL2, COL3, COL4) 
SELECT COL1, 'Foo', 'Bar', COL4
FROM MY_TEMP_TABLE;

将数据插入到“新旧”表中时,可以删除临时表。

DROP TABLE MY_TEMP_TABLE;

当我想在特定位置添加列时,通常会这样做。显然,如果这是一个生产线上系统,那么这可能不实际,但只是一个潜在的想法。

用户回答回答于

你(仍然)无法使用ALTER TABLE选择列的位置:它只能添加到表的末尾。你显然可以按照你想要的顺序选择列,所以除非你使用SELECT * FROM列顺序不应该是一个大问题。

如果你确实必须按特定顺序拥有它们,并且无法删除并重新创建表格,则可以删除并重新创建列: -

首先复制表格

CREATE TABLE my_tab_temp AS SELECT * FROM my_tab;

然后删除要插入的列后面的列

ALTER TABLE my_tab DROP COLUMN three;

现在添加新的列(在这个例子中是两个)和你删除的列。

ALTER TABLE my_tab ADD (two NUMBER(2), three NUMBER(10));

最后添加重新创建的列的数据

UPDATE my_tab SET my_tab.three = (SELECT my_tab_temp.three FROM my_tab_temp WHERE my_tab.one = my_tab_temp.one);

显然,你的更新很可能会更复杂,你将不得不处理索引和约束,并且在某些情况下不能使用它(LOB列等)。此外,这是一个非常糟糕的方式来做到这一点 - 但表格将始终存在,你将按照你想要的顺序结束列。但是列顺序真的很重要吗?

扫码关注云+社区