我想进行更新,但我想添加的条件检查不是基于主表的哈希/范围,而是基于 GSI。
实际上,如果给定的属性(即 GSI 的哈希)已经存在,我希望保存失败。
例如,在一个虚构的员工表中,“SSN”是哈希键,“EmployeeId”上有一个 GSI。这两个属性都必须是独一无二的。在保存员工时,我想确保“SSN”或“EmployeeId”都没有在表中使用。我可以为表的散列(即 SSN)做到这一点,但不能为 GSI 的散列做到这一点。
是否支持?我在文档中没有看到。
谢谢!
我想进行更新,但我想添加的条件检查不是基于主表的哈希/范围,而是基于 GSI。
实际上,如果给定的属性(即 GSI 的哈希)已经存在,我希望保存失败。
例如,在一个虚构的员工表中,“SSN”是哈希键,“EmployeeId”上有一个 GSI。这两个属性都必须是独一无二的。在保存员工时,我想确保“SSN”或“EmployeeId”都没有在表中使用。我可以为表的散列(即 SSN)做到这一点,但不能为 GSI 的散列做到这一点。
是否支持?我在文档中没有看到。
谢谢!
即使使用新宣布的事务,您描述的方法也无法使用 DynamoDB。原因是您的 GSI 最终是一致的,并且可能无法反映表中项目的最新状态,因此不能在 GSI 上使用 ConditionExpression。
但是,您可以通过使用单独的 EmployeeId-InUse 表来实现类似的功能。它可以像单个属性一样简单:employeeId
. 由于这是一个表而不是 GSI,因此您可以使用TransactWriteItems请求同时写入 EmployeeData 和 EmployeeId-InUse 表。如果事务的任何部分失败,则事务将失败,因此您可以使用 ConditionExpression防止覆盖现有项目,以确保在 SSN 或 EmployeeId 已经存在时事务将失败。
这是您的 dynamodb 请求的“TransactItems”部分对此的示例。
“TransactItems”: [
{
“Put” : {
“ConditionExpression” : “attribute_not_exists(ssn)”,
“Item” : {
... employee data goes here ...
},
“TableName”: “EmployeeData”
}
},
{
“Put” : {
“ConditionExpression” : “attribute_not_exists(employeeId)”,
“Item” : {
“employeeId”: {
“S” : “Employee1457”
}
},
“TableName”: “EmployeeIDs-InUse”
}
}
]
这里有几件事你需要注意。确保EmployeeId-InUse
每次添加或删除员工时更新表,以及更新与给定 SSN 关联的employeeId。另外,请注意,事务将消耗两倍于常规写入的容量。