Azure Cosmos DB 中的唯一索引鍵限制式

適用於:NoSQL

唯一索引鍵可為 Azure Cosmos DB 容器加入一層資料完整性。 您會在建立 Azure Cosmos DB 容器時建立唯一索引鍵原則。 利用唯一索引鍵,您就能確保邏輯分割區內一或多個值是唯一的。 您也可以確保每分割區索引鍵的唯一性。

使用唯一索引鍵原則建立容器之後,就能防止在邏輯分割區內,建立會導致出現重複項目之現有項目的新增或更新版本。 與唯一索引鍵結合的分割區索引鍵可保證項目在容器範圍內的唯一性。

例如,假設 Azure Cosmos DB 容器的唯一索引鍵限制式為 Email address,且分割區索引鍵為 CompanyID。 當您使用唯一索引鍵設定使用者的電子郵件位址時,每個項目在指定的 CompanyID 內就具有唯一的電子郵件地址。 您無法使用重複的電子郵件地址和相同的分割區索引鍵值來建立兩個項目。 在 Azure Cosmos DB 的 API for NoSQL 中,會將項目儲存為 JSON 值。 這些 JSON 值會區分大小寫。 當您選擇屬性作為唯一索引鍵時,可以為該屬性插入區分大小寫的值。 舉例來說,如果您在名稱屬性上定義了唯一索引鍵,那麼 "Gaby" 將會與 "gaby" 不同,且您可以將兩者插入容器中。

若要使用相同的電子郵件地址建立項目,但名字、姓氏和電子郵件地址不同,請將其他路徑新增至唯一索引鍵原則。 您也可以利用名字、姓氏和電子郵件的組合來建立唯一索引鍵,而不是僅根據電子郵件地址來建立唯一索引鍵。 這個金鑰也稱為複合式唯一索引鍵。 在此情況下,在指定的 CompanyID 內允許這三個值的每個唯一組合。

例如,容器可以包含具有下列值的項目,其中每個項目都會遵守唯一索引鍵限制式。

CompanyID 名字 姓氏 電子郵件地址
Contoso Gaby Duperre gaby@contoso.com
Contoso Gaby Duperre gaby@fabrikam.com
Fabrikam Gaby Duperre gaby@fabrikam.com
Fabrikam Ivan Duperre gaby@fabrikam.com
Fabrkam Duperre gaby@fabraikam.com
Fabrkam gaby@fabraikam.com

如果您嘗試使用上表中列出的組合插入另一個項目,則會收到錯誤。 此錯誤表示不符合唯一索引鍵限制式。 您會收到為 Resource with specified ID or name already existsResource with specified ID, name, or unique index already exists 的傳回訊息。

定義唯一索引鍵

只有在建立 Azure Cosmos DB 容器時,才能定義唯一索引鍵。 唯一索引鍵的範圍限定為某個邏輯分割區。 在上述範例中,如果您根據郵遞區號來分割容器,則每個邏輯分割區中可能會有相同項目。 建立唯一索引鍵時,請考慮下列屬性:

  • 您無法將現有容器更新為使用不同的唯一索引鍵。 換句話說,一旦使用唯一索引鍵原則建立容器之後,便無法變更此原則。

  • 若要為現有容器設定唯一索引鍵,請使用唯一索引鍵限制式建立新的容器。 使用適當的資料移轉工具,將資料從現有的容器移至新的容器。 針對 SQL 容器,請使用容器複製作業來移動資料。 對於 MongoDB 容器,使用 mongoimport.exe 或 mongorestore.exe 來移動資料。

  • 唯一索引鍵原則最多可包含 16 個路徑值。 舉例來說,值可以是 /firstName/lastName/address/zipCode。 每個唯一索引鍵原則最多可以有 10 個唯一索引鍵條件約束或組合。 在前一個範例中,名字、姓氏和電子郵件地址合起來是一個限制式。 此限制式會使用 16 個可能路徑中的 3 個。

  • 當容器具有唯一索引鍵原則時,建立、更新和刪除項目的要求單位 (RU) 費用會稍微更高些。

  • 不支援疏鬆的唯一索引鍵。 如果遺漏了部分唯一路徑值,則會將它們視為 Null 值,並將其納入唯一性限制式。 因此,只有具 Null 值的單一項目能夠滿足此限制式。

  • 唯一索引鍵名稱會區分大小寫。 例如,假設容器的唯一索引鍵限制式已設為 /address/zipcode。 如果您的資料具有名為 ZipCode 的欄位,Azure Cosmos DB 就會插入 "null" 作為唯一索引鍵,因為 zipcodeZipCode 不同。 由於這個區分大小寫的緣故,因此,無法插入包含 ZipCode 的所有其他記錄,因為重複的 "null" 違反唯一索引鍵限制式。

下一步