DynamoDB更改范围键列

时间:2014-06-23 04:30:49

标签: amazon-dynamodb

是否可以在创建表后修改Rangekey列。例如添加新列/属性并为表分配RangeKey。尝试搜索但无法找到有关更改范围或哈希键的任何文章

2 个答案:

答案 0 :(得分:21)

不,遗憾的是,在DynamoDB中创建表后,无法更改散列键,范围键或索引。 DynamoDB UpdateItem API Documentation清楚地表明索引无法修改。我无法在文档中找到明确指出表键无法修改的任何位置的引用,但目前它们无法更改。

请注意,除了散列和范围键之外,DynamoDB是无模式的,您可以将其他属性添加到新项目中而不会出现任何问题。不幸的是,如果您需要修改散列密钥或范围密钥,则必须创建新表并迁移数据。

修改(2014年1月):DynamoDB现在支持on the fly global secondary indexes

答案 1 :(得分:3)

要更改或创建其他排序键,您需要创建一个新表并迁移到该表,因为这两个操作都无法在现有表上完成。

DynamoDB流使我们能够在不停机的情况下迁移表。我做得非常有效,我遵循的步骤是:

  1. 创建一个新表(让我们称之为NewTable),使用所需的密钥结构,LSI,GSI。
  2. 在原始表上启用DynamoDB Streams
  3. 将Lambda关联到Stream,将记录推送到NewT​​able。 (这个Lambda应该删除步骤5中的迁移标志)
  4. [可选]在原始表格上创建GSI以加快扫描项目。确保此GSI仅具有以下属性:主键和迁移(请参阅步骤5)。
  5. 扫描上一步(或整个表)中创建的GSI并使用以下过滤器:

    FilterExpression =" attribute_not_exists(已迁移)"

  6. 使用迁移标志更新表中的每个项目(即:“Migrated”:{“S”:“0”},将其发送到DynamoDB Streams(使用UpdateItem API,以确保不会发生数据丢失)。

    注意:您可能希望在更新期间增加表格上的写入容量单位。

    1. Lambda将获取所有项目,修剪Migrated标志并将其推入NewTable。
    2. 迁移完所有项目后,将代码重新指向新表格
    3. 删除原始表格,Lambda函数一旦开心就好了。
    4. 遵循这些步骤应确保您没有数据丢失且无停机时间。

      我已经在我的博客上记录了这一点,并提供了协助代码: https://www.abhayachauhan.com/2018/01/dynamodb-changing-table-schema/