1

你能帮我解决这个问题吗(我在 Teradata 文档中没有找到它,老实说有点压倒性):我的表有这个列 -BAN DECIMAL(9,0)-,现在我想把它改成- BAN DECIMAL(15,0) COMPRESS 0.- 我该怎么做?COMPRESS 约束 0. 或其他任何含义是什么意思?我希望这是可能的,我不必创建一个新表然后从旧表中复制数据。该表非常非常大 - 当我对该表执行 COUNT(*) 时,我收到此错误:2616 计算期间发生数字溢出

4

3 回答 3

2

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

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

select cast(count(*) as bigint) 
from table_name;
于 2012-08-10T12:25:19.210 回答
2

你问了三个不同的问题:

  1. 您不能将列的数据类型从 更改DECIMAL(9,0)DECIMAL(15,0)。您最好的选择是创建一个新列 (NEW_BAN),从旧列分配值,删除旧列并将 NEW_BAN 重命名为 BAN)。

  2. COMPRESS 0不是约束。这意味着从表中压缩“零”值,从而节省磁盘空间。

  3. COUNT(*)正在返回该错误,因为该表有超过 2,147,483,647 行(整数的最大值)。将结果转换为 BIGINT(如 Catcall 所示)。

我同意,文档可能是压倒性的。但请耐心等待,只关注您的确切版本的 SQL 标题。他们真的写得很好。

于 2012-08-10T13:47:37.073 回答
1

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

于 2012-08-10T13:31:46.583 回答