Redshift 使用数据更改数字列

Posted

技术标签:

【中文标题】Redshift 使用数据更改数字列【英文标题】:Redshift alter numeric column with data 【发布时间】:2021-01-21 10:51:24 【问题描述】:

我在 Redshift 中有一个表,其中包含速率列和日期列。 rate 列的数字数据类型为 (18,2)。我想将其更改为(18,4)。由于该列已包含数据,因此我无法更改该列。有没有办法在不丢失数据的情况下做到这一点。这是我正在使用的语法和我得到的错误。 这是语法

ALTER TABLE pricetable 
   ALTER COLUMN product_price 
   TYPE numeric(18,4);

这是错误

无效操作:无法更改关系“pricetable”的列“product_price”[SQL State=0A000, DB Errorcode=500310]**

【问题讨论】:

为什么更改列不起作用? db-fiddle.com/f/6Ftk7VqEpnPL6b8GkZRRJS/0 不做你想做的事吗? 为什么你认为你不能改变数据类型? postgresql.org/docs/current/sql-altertable.html 我使用相同的语法,但我只使用了 TYPE 而不是 SET DATA TYPE。改变也没有奏效。我的桌子在红移。有影响吗? 您能否向我们展示您的 SQL、错误消息和/或任何其他结果?我们现在只是猜测发生了什么 Redshift 不是 postgresql。如果您的问题是关于红移的,您应该更改问题标签。 【参考方案1】:

这可能失败的原因有很多。我将使用 Redshift 文档来展示很多内容:

ALTER COLUMN column_name TYPE new_data_type 定义为 VARCHAR 数据类型的列的大小。考虑 以下限制:

您不能使用压缩编码 BYTEDICT 更改列, RUNLENGTH、TEXT255 或 TEXT32K。

您不能将大小减小到小于现有数据的最大大小。

您不能使用默认值更改列。

您不能使用 UNIQUE、PRIMARY KEY 或 FOREIGN KEY 更改列。

您不能更改事务块中的列(BEGIN ... END)。 有关事务的更多信息,请参阅可序列化隔离。

这导致以下问题/可能性:

product_price 列的编码是什么? 现有数据是否适合 18,4?您丢失了小数点前 2 位数字 - 您可能需要 20,4。 product_price 有默认值吗? product_price 列是否有限制或是否是键? 您是处于自动提交模式还是在执行时管理您的事务块? (运行“END; ;”作为一个块)

根据您遇到的问题,有一些方法可以解决这些问题。像自动提交模式和添加新列、重命名旧列和新列以及删除旧列等。

【讨论】:

以上是关于Redshift 使用数据更改数字列的主要内容,如果未能解决你的问题,请参考以下文章

使用 Amazon Redshift 进行维度建模是不是可行

无法使用 aws nodejs sdk 创建 Redshift 表

插入数据:查看哪一列导致 Redshift 上的数字溢出

如何使用更改表查询在 AWS Redshift 中添加多列

星型模式的 OLAP 或 OLTP?

如何将访问密钥和秘密密钥 shell 变量传递给 Redshift 复制命令