2012-08-13 54 views
1

移動列從來就在Teradata數據創建了一個新列,然後我已經從另一個科拉姆數據到這個新colmn。之後,我刪除了舊列。 現在我想要做的是將新列移動到舊列的表中相同的位置。 我想問你 - 是否可能?在Teradata的

回答

3

除非業務需要強制執行表定義的列的順序位置(例如時間戳在表定義中的最後一列),它其實並不重要。如果您有一個使用適當的ROW ACCESS鎖定將列視圖列(1:1)映射到視圖列的V1層,則視圖定義可以始終向最終用戶和BI應用程序公開列的首選序號位置。

如果必須重新排列您的列執行以下操作:

  1. 提交CREATE TABLE MyDB.MyTable_用你喜歡的順序位置,列缺省值,任何值列表壓縮。
  2. COLLECT STATISTICS ON MyDB.MyTable_ FROM MyDB.MyTable; -- Migrate collected statistics
  3. INSERT INTO MyDB.MyTable_ SELECT /* Columns */ FROM MyDB.MyTable;
  4. RENAME MyDB.MyTable AS MyDB.MyTable1; RENAME TABLE MyDB.MyTable_ AS MyDB.MyTable;
  5. 後確認一切正常,DROP TABLE MyDB.MyTable1;

你也可以執行以下操作來代替步驟1和3:

CREATE TABLE MyDB.MyTable_ 
     (/* Column Definitions in new Order */) AS 
     (SELECT /* New Column Ordering */ 
      FROM MyDB.MyTable) 
     WITH DATA AND STATISTICS 
     {UNIQUE} PRIMARY INDEX (/* Primary Index Columns */); 

統計可能會或可能不會過來使用此填充做法。在創建新表之後,您需要驗證這一點。

+1

鮑勃,你的回答總是多於幫助。謝謝! – Dantes 2012-08-14 07:10:38

3

因爲這是關係到your previous question,我會盡量在同樣的情況下回答。

不,你不能在事後更改列的順序。當您將一個新列「添加」到現有表格時,它將在表格描述的末尾定義。如果您確實需要列在物理表中以特定順序顯示,則必須完全重新創建表。

但是,您可以創建一個顯示在任何你想要的順序行的視圖。實際上,如果您打算將此表用於某種應用程序,則無論如何您都應該創建一個VIEW(這樣您可以建立正確的訪問鎖定)。例如,假設你有一個名爲MYTABLE有三列爲col_a,COL_B和COL_C表,並且要以相反的順序它們「顯示」:

replace view MYDB.MYTABLE_V as 
locking MYDB.MYTABLE for access 
select COL_C, COL_B, COL_A 
from MYDB.MYTABLE 

使用「替換視圖」如果它不將創建視圖已經存在,或者如果它存在,則將其替換當然,這意味着如果您改變表格,則必須重新創建視圖。爲了安全起見,我在表創建程序的註釋塊中保留了視圖定義。

+1

鮑勃,謝謝你的回答!這幫助我清楚瞭解Teradata的一些疑問。 – Dantes 2012-08-14 07:11:12