You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DynamoDB中仅当PK和SK组合不存在时执行Put操作?

解决DynamoDB联合主键下避免覆盖数据的问题

要在包含PK(分区键)和SK(排序键)的表中避免覆盖特定的PK/SK组合,你需要精准检查数据库中是否已存在该组合的项,而非单独检查属性是否存在。以下是修改后的代码和说明:

修改后的代码示例

let params = {
    TableName: process.env.NIMS_TABLE_NAME,
    Item: { 
        ...userObj, 
        PK: userObj.sid,  // 替换为你的分区键字段值
        SK: userObj.userId // 替换为你的排序键字段值,根据业务实际调整
    },
    ConditionExpression: "NOT (PK = :pk AND SK = :sk)",
    ExpressionAttributeValues: {
        ":pk": userObj.sid,
        ":sk": userObj.userId
    }
};

try {
    await docClient.put(params).promise();
    return { success: true, sid: userObj.sid, userId: userObj.userId };
} catch (err) {
    if (err.message === "The conditional request failed") {
        err.message += ` (Item with PK (${userObj.sid}) and SK (${userObj.userId}) already exists)`;
    }
    callback(new Error(`[422] ${err.message}`));
}

关键说明

  • ConditionExpression 写法:NOT (PK = :pk AND SK = :sk) 直接检查数据库中是否存在与当前插入的PK、SK值完全匹配的项。只有当该组合不存在时,才会执行put操作,彻底避免覆盖已有数据。
  • ExpressionAttributeValues:使用参数绑定的方式传递PK和SK的值,是DynamoDB推荐的规范写法,既能避免语法注入风险,也让代码更具可读性和维护性。
  • 错误提示优化:在catch块中更新了错误信息,明确指出是哪个PK/SK组合已存在,便于问题排查。

内容的提问来源于stack exchange,提问作者lowcrawler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 10:52:23