I’m trying to create a simple table using DynamoDB javascript shell and I’m getting this exception:
{
"message": "The number of attributes in key schema must match the number of attributes defined in attribute definitions.",
"code": "ValidationException",
"time": "2015-06-16T10:24:23.319Z",
"statusCode": 400,
"retryable": false
}
Below is the table I’m trying to create:
var params = {
TableName: 'table_name',
KeySchema: [
{
AttributeName: 'hash_key_attribute_name',
KeyType: 'HASH',
},
],
AttributeDefinitions: [
{
AttributeName: 'hash_key_attribute_name',
AttributeType: 'S',
},
{
AttributeName: 'attribute_name_1',
AttributeType: 'S',
}
],
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1,
},
};
dynamodb.createTable(params, function(err, data) {
if (err) print(err);
else print(data);
});
However if I add the second attribute to the keySchema, it works fine. Below a the working table:
var params = {
TableName: 'table_name',
KeySchema: [
{
AttributeName: 'hash_key_attribute_name',
KeyType: 'HASH',
},
{
AttributeName: 'attribute_name_1',
KeyType: 'RANGE',
}
],
AttributeDefinitions: [
{
AttributeName: 'hash_key_attribute_name',
AttributeType: 'S',
},
{
AttributeName: 'attribute_name_1',
AttributeType: 'S',
}
],
ProvisionedThroughput: {
ReadCapacityUnits: 1,
WriteCapacityUnits: 1,
},
};
dynamodb.createTable(params, function(err, data) {
if (err) print(err);
else print(data);
});
I don’t want to add the range to key schema. Any idea how to fix it?
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: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.TL;DR Don't include any non-key attribute definitions in
AttributeDefinitions
.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.
Commenting out these lines in the table creation solved my problem. So I guess the list has to be null, not empty.
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 link
So no need to put non-key attribute in "AttributeDefinitions" if you're not gonna use it as index or primary key.