表名:products

一、SET — 修改或新增字段

改之前

product_id (PK)

name

price

stock

P001

机械键盘

499

100

P002

无线鼠标

129

200

Lambda 代码

import boto3
​
client = boto3.client('dynamodb')
​
def lambda_handler(event, context):
    client.update_item(
        TableName='products',
        Key={'product_id': {'S': 'P001'}},
        UpdateExpression='SET price = :p, stock = :s',
        ExpressionAttributeValues={
            ':p': {'N': '599'},
            ':s': {'N': '80'}
        }
    )

改之后

product_id (PK)

name

price

stock

P001

机械键盘

599

80

P002

无线鼠标

129

200

SET 也能新增字段。如果字段不存在,会自动创建。

新增字段示例

client.update_item(
    TableName='products',
    Key={'product_id': {'S': 'P001'}},
    UpdateExpression='SET color = :c',
    ExpressionAttributeValues={
        ':c': {'S': '黑色'}
    }
)

改之后

product_id (PK)

name

price

stock

color

P001

机械键盘

599

80

黑色


二、SET 数学运算 — 加减库存

改之前

product_id (PK)

name

price

stock

P001

机械键盘

599

80

Lambda 代码

def lambda_handler(event, context):
    # 库存减 5
    client.update_item(
        TableName='products',
        Key={'product_id': {'S': 'P001'}},
        UpdateExpression='SET stock = stock - :n',
        ExpressionAttributeValues={
            ':n': {'N': '5'}
        }
    )

改之后

product_id (PK)

name

price

stock

P001

机械键盘

599

75

stock = stock + :n 就是加库存,stock = stock - :n 就是减库存。


三、REMOVE — 删除字段

改之前

product_id (PK)

name

price

stock

color

P001

机械键盘

599

75

黑色

Lambda 代码

def lambda_handler(event, context):
    client.update_item(
        TableName='products',
        Key={'product_id': {'S': 'P001'}},
        UpdateExpression='REMOVE color'
    )

改之后

product_id (PK)

name

price

stock

P001

机械键盘

599

75

color 字段整个消失了,不是变成空,是彻底没了。


四、ADD — 数字原子加(适合并发场景)

改之前

product_id (PK)

name

price

stock

P001

机械键盘

599

75

Lambda 代码

def lambda_handler(event, context):
    # 库存加 20
    client.update_item(
        TableName='products',
        Key={'product_id': {'S': 'P001'}},
        UpdateExpression='ADD stock :n',
        ExpressionAttributeValues={
            ':n': {'N': '20'}
        }
    )

改之后

product_id (PK)

name

price

stock

P001

机械键盘

599

95

ADD 和 SET 的区别:ADD 是原子操作,多个 Lambda 同时加库存不会冲突。SET 在高并发下可能覆盖。

ADD 减库存::n 传负数 {'N': '-5'}


五、SET + REMOVE 组合使用

改之前

product_id (PK)

name

price

stock

old_field

P001

机械键盘

599

95

废弃数据

Lambda 代码

def lambda_handler(event, context):
    client.update_item(
        TableName='products',
        Key={'product_id': {'S': 'P001'}},
        UpdateExpression='SET price = :p REMOVE old_field',
        ExpressionAttributeValues={
            ':p': {'N': '549'}
        }
    )

改之后

product_id (PK)

name

price

stock

P001

机械键盘

549

95

一次调用同时改价格 + 删废弃字段。SET 和 REMOVE 之间不需要逗号,直接空格隔开。


六、带条件更新 — ConditionExpression

改之前

product_id (PK)

name

price

stock

P001

机械键盘

549

95

Lambda 代码

def lambda_handler(event, context):
    try:
        client.update_item(
            TableName='products',
            Key={'product_id': {'S': 'P001'}},
            UpdateExpression='SET stock = stock - :n',
            ConditionExpression='stock >= :n',
            ExpressionAttributeValues={
                ':n': {'N': '10'}
            }
        )
    except client.exceptions.ConditionalCheckFailedException:
        print('库存不足,扣减失败')

库存 95 >= 10,条件满足,改之后:

product_id (PK)

name

price

stock

P001

机械键盘

549

85

如果库存只有 3,条件不满足(3 < 10):

数据不变,抛出 ConditionalCheckFailedException

比赛中扣库存一定要加条件判断,防止库存变负数。


七、ExpressionAttributeNames — 字段名是保留字时

namestatus 是 DynamoDB 保留字,直接写会报错。

改之前

product_id (PK)

name

price

status

P001

机械键盘

549

active

Lambda 代码

def lambda_handler(event, context):
    client.update_item(
        TableName='products',
        Key={'product_id': {'S': 'P001'}},
        UpdateExpression='SET #n = :n, #s = :s',
        ExpressionAttributeNames={
            '#n': 'name',
            '#s': 'status'
        },
        ExpressionAttributeValues={
            ':n': {'S': '机械键盘Pro'},
            ':s': {'S': 'discontinued'}
        }
    )

改之后

product_id (PK)

name

price

status

P001

机械键盘Pro

549

discontinued

#n 是占位符,映射到真实字段名 name:n 是值占位符。# 开头 = 字段名,: 开头 = 值。


总结速查表

操作

UpdateExpression

效果

修改字段

SET price = :p

改值

新增字段

SET color = :c

字段不存在就新建

数学运算

SET stock = stock - :n

加减计算

删除字段

REMOVE color

字段消失

原子加

ADD stock :n

并发安全

组合操作

SET price = :p REMOVE old

一次搞定多个操作

条件更新

+ ConditionExpression

不满足条件就不改

保留字

#n + ExpressionAttributeNames

字段名冲突时用