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 进行维度建模是不是可行