将列数据类型从DECIMAL(9,0)更改为DECIMAL(15,0)

时间:2012-08-10 09:46:09

标签: sql teradata

你可以帮我解决这个问题(我没有在Teradata文档中找到它,这实际上没什么大不了的):我的表有这个列-BAN DECIMAL(9,0) - 现在我想要改为 - BAN DECIMAL(15,0)COMPRESS 0.-我该怎么办? COMPRESS约束0或任何其他意思是什么? 我希望这是可能的,我不必创建一个新表,然后从旧表中复制数据。该表非常大 - 当我从表中执行COUNT(*)时出现此错误:计算过程中出现2616数字溢出

3 个答案:

答案 0 :(得分:2)

ALTER TABLE的语法图似乎不支持直接更改列的数据类型。 (Teradata SQL DDL Documentation)。 COMPRESS 0压缩零。 Teradata支持许多不同类型的压缩。

此处的数字溢出可能意味着您已超出整数范围。要使该部分工作,只需尝试转换为更大的数据类型。 (您无需更改列的数据类型即可执行此操作。)

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

答案 1 :(得分: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所示)。

  4. 我同意,文件可能是压倒性的。但请耐心等待,并专注于您的确切版本的SQL标题。他们写得很好。

答案 2 :(得分:1)

您不能使用ALTER TABLE将数据类型从DECIMAL(9,0)更改为DECIMAL(15,0),因为它跨越了在表中存储值所需的字节边界。对于Teradata 13.10,请参阅Teradata手册,了解 SQL数据定义语言详细主题第61-65页,了解有关使用ALTER TABLE更改列数据类型的更多详细信息。