将列添加到现有的redshift表

时间:2019-02-26 13:08:18

标签: sql amazon-web-services amazon-redshift

我有一个数据库,其中包含超过3000万条记录,并且需要向数据库中添加两个新列。问题是我需要这些列为NOT NULL,并且没有默认值。我以为我只会添加没有NOT NULL约束的这些列,用数据填充它们,然后添加约束,但是Redshift不支持该列。我心中还有其他解决方案,但是我想知道是否有比这更简单的解决方案?

  1. 使用NOT NULL和DEFAULT创建两个新列
  2. 用数据填充列
  3. 使用与目标数据库相同的列创建一个空表。 (当然,这两个新列只是NOT NULL)
  4. 插入从目标数据库到新数据库的所有内容。
  5. 删除目标数据库
  6. 将新数据库重命名为目标。

1 个答案:

答案 0 :(得分:0)

我建议:

  • 现有Table-A
  • 创建一个包含新列的新Table-B以及与customer_id相匹配的标识列(例如Table-A)。
  • 将数据插入Table-B(2列+身份列)
  • 使用CREATE TABLE AS同时创建新的Table-C(指定DISTKEY和SORTKEY),同时通过标识列上的JOIN查询Table-ATable-B
  • 验证Table-C的内容
  • VACCUM Table-C(不必,但以防万一,应该很快)
  • 删除Table-ATable-B
  • Table-C重命名为所需的表名(可能与Table-A相同)

摘要:Table-A中的现有列+ Table-BTable-C中的多余列

理由:

  • UPDATE语句在Redshift中不能很好地运行。它要求将每列的现有数据行标记为“已删除”,然后将新行追加到每列的末尾。进行许多UPDATES操作将耗尽表的大小,并且它将变得无法排序。它也相对较慢。之后,您需要对表进行Deep Copy或VACUUM修复。
  • CREATE TABLE AS与JOIN一起使用将在一个查询中生成所有“最终状态”数据,并且结果表将被排序并处于“干净”状态
  • 该过程使您有机会在提交切换前验证Table-C的内容。非常方便调试过程!

另请参阅:Performing a Deep Copy - Amazon Redshift