2012-08-10 181 views
1

您可以請我幫忙解決此問題(我沒有在Teradata文檔中找到它,實際上它確實有點壓倒性):我的桌子有此列-BAN DECIMAL(9,0) - ,現在我想將其更改爲 - BAN DECIMAL(15,0)COMPRESS 0.-我該怎麼做? COMPRESS約束0還是任何其他含義呢? 我希望這是可能的,我不必創建一個新表,然後從舊錶中複製數據。表格非常大 - 當我做COUNT(*)表格時,我得到這個錯誤:在計算過程中發生了2616數字溢出將列數據類型從DECIMAL(9,0)更改爲DECIMAL(15,0)

回答

2

ALTER TABLE的語法圖似乎不支持直接更改列的數據類型。 (Teradata SQL DDL Documentation)。 COMPRESS 0壓縮爲零。 Teradata支持許多不同類型的壓縮。

這裏的數字溢出可能意味着您已經超出了整數的範圍。爲了使這部分工作,只需嘗試轉換爲更大的數據類型。 (你並不需要更改列的數據類型來做到這一點。)

select cast(count(*) as bigint) 
from table_name; 
+0

因此基本上,你建議創建新表並將數據從現有表傳輸到新創建的表中?沒有其他辦法了? – Dantes 2012-08-10 12:30:17

+0

您可以添加新列而不是新表,複製數據,刪除舊列並重命名新列。 (語法在DDL文檔中。)我想我已經在Teradata用戶論壇上看到了關於創建新表的討論通常更快。 – 2012-08-10 13:24:44

1

不能使用ALTER TABLEDECIMAL(9,0)數據類型更改爲DECIMAL(15,0),因爲它跨越存儲值所需的字節邊界桌子。對於Teradata 13.10,有關使用ALTER TABLE更改列數據類型的更多詳細信息,請參閱Teradata手冊SQL數據定義語言詳細主題第61-65頁。

2

你問了三個不同的問題:

  1. 不能從DECIMAL(9,0)列的數據類型更改爲DECIMAL(15,0)。最好的辦法是創建一個新列(NEW_BAN),從舊列中分配值,刪除舊列並將NEW_BAN重命名爲BAN)。

  2. COMPRESS 0不是約束。這意味着從表中壓縮「零」的值,節省磁盤空間。

  3. 您的COUNT(*)正在返回該錯誤,因爲該表有超過2,147,483,647行(INTEGER的最大值)。將結果轉換爲BIGINT(如Catcall所示)。

我同意,文檔可以壓倒性的。但要耐心,只關注SQL確切發佈的標題。他們寫得很好。

+0

嗨,鮑勃!謝謝回覆。我喜歡關於添加新列和在新列中複製數據的建議。 我想知道是否可以保持相同的列順序,即我可以將新列放在舊列所在的同一位置,還是隻能位於該表的末尾? – Dantes 2012-08-13 07:23:01