2011-03-22 127 views
18

我有一個特定的場景,我必須在Oracle中的現有表中插入兩個新列。我無法做到丟棄和重新創建表格。那麼可以通過什麼方式來實現?如何在oracle中的特定位置插入列而不刪除並重新創建表?

+4

12c有一個技巧可以做到這一點:http://tkyte.blogspot.com.au/2013/07/12c-silly-little-trick-with-invisibility.html(注意,然而,沒有邏輯原因來更改列順序。) – 2013-07-03 00:54:36

+0

難道你不想在表的最後添加最可能爲空的列來節省空間嗎?請參閱https://community.oracle.com/thread/855964 – 2016-12-29 12:26:37

回答

15

Amit-

我不相信你可以在任何地方,但在表的末尾添加一列一旦創建了表。一種解決方案可能是試試這個:

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; 

這往往是我做什麼,當我想在一個特定的位置添加列。顯然,如果這是一個生產線上系統,那麼這可能不實際,但只是一個潛在的想法。

-CJ

5

你(還)不能選擇使用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列等)。此外,這是一個非常糟糕的方式來做到這一點 - 但表格將始終存在,您將按照您想要的順序結束列。但是列順序真的很重要嗎?

4

雖然這有點舊,但我想添加一個稍微改進的版本,它確實會改變列順序。以下是具體步驟(假設我們有一個列COL1,COL2,COL3表TAB1):

  1. 添加新列的表TAB1:
alter table TAB1 add (NEW_COL number);
  1. 「複製」 表溫度名字同時改變列順序和重命名新列:
create table tempTAB1 as select NEW_COL as COL0, COL1, COL2, COL3 from TAB1;
  1. 刪除現有表:
drop table TAB1;
  1. 重命名臨時表名,只是下降的表名:
rename tempTAB1 to TAB1;
-10

就這樣做:

alter table TABLE_NAME (COLUMN_NAME  DATA_TYPE); 

一個新列會被添加到表格的末尾。

相關問題