Number of attributes in key schema must match the number of attributes defined in attribute definitions

前端 未结 3 822
囚心锁ツ
囚心锁ツ 2021-01-30 19:03

I’m trying to create a simple table using DynamoDB JavaScript shell and I’m getting this exception:

{
  "message&quo         


        
相关标签:
3条回答
  • 2021-01-30 19:51

    I also had this problem and I'll post here what went wrong for me in case it helps someone else.

    In my CreateTableRequest, I had an empty array for the GlobalSecondaryIndexes.

    CreateTableRequest createTableRequest = new CreateTableRequest
    {
      TableName = TableName,
      ProvisionedThroughput = new ProvisionedThroughput { ReadCapacityUnits = 2, WriteCapacityUnits = 2 },
      KeySchema = new List<KeySchemaElement>
      {
         new KeySchemaElement
         {
            AttributeName = "Field1",
            KeyType = KeyType.HASH
         },
         new KeySchemaElement
         {
            AttributeName = "Field2",
            KeyType = KeyType.RANGE
         }
      },
      AttributeDefinitions = new List<AttributeDefinition>()
      {
         new AttributeDefinition
         {
             AttributeName = "Field1", 
             AttributeType = ScalarAttributeType.S
         },
         new AttributeDefinition
         {
            AttributeName = "Field2",
            AttributeType = ScalarAttributeType.S
         }
      },
      //GlobalSecondaryIndexes = new List<GlobalSecondaryIndex>
      //{                            
      //}
    };
    

    Commenting out these lines in the table creation solved my problem. So I guess the list has to be null, not empty.

    0 讨论(0)
  • 2021-01-30 19:52

    When you use non-key attribute in at "AttributeDefinitions", you must use it as index, otherwise it's against the way of DynamoDB to work. See the link.

    So no need to put a non-key attribute in "AttributeDefinitions" if you're not gonna use it as index or primary key.

    var params = {
            TableName: 'table_name',
            KeySchema: [ // The type of of schema.  Must start with a HASH type, with an optional second RANGE.
                { // Required HASH type attribute
                    AttributeName: 'UserId',
                    KeyType: 'HASH',
                },
                { // Optional RANGE key type for HASH + RANGE tables
                    AttributeName: 'RemindTime', 
                    KeyType: 'RANGE', 
                }
            ],
            AttributeDefinitions: [ // The names and types of all primary and index key attributes only
                {
                    AttributeName: 'UserId',
                    AttributeType: 'S', // (S | N | B) for string, number, binary
                },
                {
                    AttributeName: 'RemindTime',
                    AttributeType: 'S', // (S | N | B) for string, number, binary
                },
                {
                    AttributeName: 'AlarmId',
                    AttributeType: 'S', // (S | N | B) for string, number, binary
                },
                // ... more attributes ...
            ],
            ProvisionedThroughput: { // required provisioned throughput for the table
                ReadCapacityUnits: 1, 
                WriteCapacityUnits: 1, 
            },
            LocalSecondaryIndexes: [ // optional (list of LocalSecondaryIndex)
                { 
                    IndexName: 'index_UserId_AlarmId',
                    KeySchema: [ 
                        { // Required HASH type attribute - must match the table's HASH key attribute name
                            AttributeName: 'UserId',
                            KeyType: 'HASH',
                        },
                        { // alternate RANGE key attribute for the secondary index
                            AttributeName: 'AlarmId', 
                            KeyType: 'RANGE', 
                        }
                    ],
                    Projection: { // required
                        ProjectionType: 'ALL', // (ALL | KEYS_ONLY | INCLUDE)
                    },
                },
                // ... more local secondary indexes ...
            ],
        };
        dynamodb.createTable(params, function(err, data) {
            if (err) ppJson(err); // an error occurred
            else ppJson(data); // successful response
        });
    
    0 讨论(0)
  • 2021-01-30 19:59

    TL;DR Don't include any non-key attribute definitions in AttributeDefinitions.

    DynamoDB is schemaless (except the key schema)

    That is to say, you do need to specify the key schema (attribute name and type) when you create the table. Well, you don't need to specify any non-key attributes. You can put an item with any attribute later (must include the keys of course).

    From the documentation page, the AttributeDefinitions is defined as:

    An array of attributes that describe the key schema for the table and indexes.

    When you create table, the AttributeDefinitions field is used for the hash and/or range keys only. In your first case, there is hash key only (number 1) while you provide 2 AttributeDefinitions. This is the root cause of the exception.

    0 讨论(0)
提交回复
热议问题