2014-06-23 121 views
8

是否可以在創建表後修改Rangekey列。如添加新的列/屬性併爲表格指定RangeKey。嘗試搜索,但無法找到任何有關更改範圍或哈希鍵的文章DynamoDB更改範圍鍵列

回答

12

不幸的是,不幸的是,在DynamoDB中創建表之後,無法更改哈希鍵,範圍鍵或索引。 DynamoDB UpdateItem API Documentation很清楚索引無法修改的事實。我無法在文檔中的任何位置找到明確指出表格密鑰無法修改的參考,但目前它們無法更改。

請注意,除hash和range鍵之外,DynamoDB是無模式的,您可以將其他屬性添加到新項目中而不會出現問題。不幸的是,如果您需要修改散列鍵或範圍鍵,則必須創建一個新表並遷移數據。

編輯(2014年1月):DynamoDB現在已經支持on the fly global secondary indexes

+0

所以,無論是分區鍵(主),也不是排序鍵可以修改? – Vadorequest

+1

@Vadorequest是正確的 - 如果您需要修改,您需要創建一個新表並遷移您的數據。 – rpmartz

+0

然後我猜最安全的方法是默認不使用散列鍵,並在需要時添加額外的索引。在創建表本身時應該是什麼應該是散列並且強制所有請求提供散列值來檢索項目可能是一個相當大的問題,如果這是一個不好的選擇。 – Vadorequest

1

要更改或創建一個額外的排序關鍵字,你需要創建一個新表,並遷移到它,因爲這兩個動作不能在現有的表上完成。

DynamoDB流使我們能夠在沒有任何停機時間的情況下遷移表。我已經做到了這一點非常有效,我遵循的步驟如下:

  1. 創建一個新表(我們稱之爲NewTable)和所需的關鍵結構LSIs GSIs。
  2. 在原始表上啓用DynamoDB流
  3. 將Lambda與流關聯起來,該流將記錄推入NewTable。 (此Lambda應在步驟5中修剪移動標誌)
  4. [可選]在原始表格上創建一個GSI以加速掃描項目。確保此GSI僅具有屬性:主鍵和遷移(請參閱步驟5)。
  5. 掃描在先前步驟(或整個表)中創建的GSI和使用下面的過濾器:

    FilterExpression =「attribute_not_exists(遷移)」

更新每個項目表中的與一個遷移標誌(即:「遷移」:{「S」:「0」},它把它發送到DynamoDB流(使用的updateItem API,以確保不會發生數據丟失)

:你可能想增加寫入能力uni在更新期間在桌面上。

  1. Lambda將拾取所有項目,修剪Migrated標誌並將其推入NewTable。
  2. 所有項目都被遷移後,將代碼重新指定到新表
  3. 刪除原始表和Lambda函數,一旦開心一切都很好。

以下步驟應確保您沒有數據丟失和停機時間。

我已經記錄在本上我的博客,用代碼來幫助: https://www.abhayachauhan.com/2017/10/dynamodb-changing-table-schema