amazon-redshift - 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]**
解决方案
这可能失败的原因有很多。我将使用 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; ;”作为一个块)
根据您遇到的问题,有一些方法可以解决它们。像自动提交模式和添加新列,重命名旧列和新列,以及删除旧列等。
推荐阅读
- elasticsearch - 弹性 Lucene 查询不能与日期一起正常工作
- angularjs - ng-init="loadBankNames()" ng-init() 在引导模型代码中不起作用
- sql - 返回没有内部连接匹配的 LINE
- batch-file - 尝试在 BQ 提取上使用管道符号时出错
- shopify - Shopify Admin GraphQL API 用于获取特定日期的订单
- android - 避免在 Android 8.0 的电视频道中创建重复频道
- javascript - wicked_pdf gem 不执行 formBuilder 渲染功能
- sql - 如何在迁移中自动删除约束 DF_
- uwp - 尝试使用软件 KMDF 驱动程序访问 CustomDevice.FromIdAsync 时访问被拒绝
- angular - 在第一个元素之后在 Angular 8 中出现“错误类型错误:无法读取未定义的属性‘长度’”问题