你能帮我解决这个问题吗(我在 Teradata 文档中没有找到它,老实说有点压倒性):我的表有这个列 -BAN DECIMAL(9,0)-,现在我想把它改成- BAN DECIMAL(15,0) COMPRESS 0.- 我该怎么做?COMPRESS 约束 0. 或其他任何含义是什么意思?我希望这是可能的,我不必创建一个新表然后从旧表中复制数据。该表非常非常大 - 当我对该表执行 COUNT(*) 时,我收到此错误:2616 计算期间发生数字溢出
3 回答
ALTER TABLE 的语法图似乎不支持直接更改列的数据类型。(Teradata SQL DDL 文档)。COMPRESS 0
压缩零。Teradata 支持许多不同类型的压缩。
这里的数值溢出可能意味着你已经超出了整数的范围。为了使这部分工作,只需尝试转换为更大的数据类型。(您无需更改列的数据类型即可执行此操作。)
select cast(count(*) as bigint)
from table_name;
你问了三个不同的问题:
您不能将列的数据类型从 更改
DECIMAL(9,0)
为DECIMAL(15,0)
。您最好的选择是创建一个新列 (NEW_BAN),从旧列分配值,删除旧列并将 NEW_BAN 重命名为 BAN)。COMPRESS 0
不是约束。这意味着从表中压缩“零”值,从而节省磁盘空间。您
COUNT(*)
正在返回该错误,因为该表有超过 2,147,483,647 行(整数的最大值)。将结果转换为 BIGINT(如 Catcall 所示)。
我同意,文档可能是压倒性的。但请耐心等待,只关注您的确切版本的 SQL 标题。他们真的写得很好。
您不能使用ALTER TABLE
将数据类型从更改为DECIMAL(9,0)
,DECIMAL(15,0)
因为它跨越了在表中存储值所需的字节边界。对于 Teradata 13.10,有关使用更改列数据类型的更多详细信息,请参阅SQL 数据定义语言详细主题第 61-65 页的 Teradata 手册。ALTER TABLE