我认为当键模式类型和具体项目类型之间存在简单的类型不匹配时,这种情况更有可能发生。
来自Managing Global Secondary Indexes -
注意
在某些情况下,由于索引键违规,DynamoDB 将无法将数据从表写入索引。如果属性值的数据类型与索引键模式数据类型的数据类型不匹配,或者如果属性的大小超过索引键属性的最大长度,则会发生这种情况。索引键违规不会干扰全局二级索引的创建;但是,当索引变为 ACTIVE 时,索引中不会出现违规键。
DynamoDB 提供了用于查找和解决这些问题的独立工具。如需更多信息,请参阅Detecting and Correcting Index Key Violations。
举例
项目看起来像:
"Items": [
{
"Timestamp": {
"N": "1542475507"
},
"DevID": {
"S": "slfhioh1234oi23lk23kl4h235pjpo235lnsfvuwerfj2roin2l3rn9fj9f8hwen"
},
"UID": {
"S": "1"
}
}
],
索引看起来像:
"GlobalSecondaryIndexes": [
{
"IndexName": "UID-Timestamp-index",
"Projection": {
"ProjectionType": "KEYS_ONLY"
},
"ProvisionedThroughput": {
"WriteCapacityUnits": 1,
"ReadCapacityUnits": 1
},
"KeySchema": [
{
"KeyType": "HASH",
"AttributeName": "UID"
},
{
"KeyType": "RANGE",
"AttributeName": "Timestamp"
}
],
}
]
表格有属性定义:
"AttributeDefinitions": [
{
"AttributeName": "Timestamp",
"AttributeType": "S"
},
{
"AttributeName": "UID",
"AttributeType": "S"
}
]
该项目将不会出现在您的新索引中。
类型不匹配(在本例中为 "S" != "N" )完全有可能在创建时没有被标记。这是有道理的。您可能想要故意做这种事情,但是当您不小心做时 - 它不是很好。