【问题标题】:Changing column datatype from DECIMAL(9,0) to DECIMAL(15,0)将列数据类型从 DECIMAL(9,0) 更改为 DECIMAL(15,0)
【发布时间】:2012-08-10 09:46:08
【问题描述】:

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

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

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

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

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

    【讨论】:

    • 那么基本上,您建议创建新表并将现有表中的数据传输到新创建的表中?没有别的办法吗?
    • 您可以添加新列而不是新表、复制数据、删除旧列以及重命名新列。 (语法在 DDL 文档中。)我想我在 Teradata 用户论坛上看到过讨论说创建新表通常更快。
    【解决方案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 标题。他们真的写得很好。

    【讨论】:

    • 嗨,鲍勃!谢谢回复。我喜欢关于添加新列并在该新列中复制数据的建议。我想知道是否可以保持相同的列顺序,即我可以将新列放在旧列所在的同一位置,还是该列只能位于表的末尾?
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2015-01-07
      • 2020-10-06
      • 2014-02-10
      • 2021-08-09
      • 1970-01-01
      相关资源
      最近更新 更多