首页 > 解决方案 > Redshift 使用数据更改数字列

问题描述

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

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

这是错误

无效操作:无法更改关系“pricetable”的列“product_price”[SQL 状态=0A000,DB 错误代码=500310]**

标签: amazon-redshiftddl

解决方案


这可能失败的原因有很多。我将使用 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; ;”作为一个块)

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


推荐阅读