更新文档 #

一、UPDATE语句概述 #

1.1 基本语法 #

sql
UPDATE <class>|RID|<query> 
SET <field> = <value>[, <field> = <value>]*
[WHERE <condition>]
[RETURN <return-spec>]

UPDATE <class>|RID|<query> 
ADD <field> = <value>[, <field> = <value>]*
[WHERE <condition>]

UPDATE <class>|RID|<query> 
REMOVE <field>[, <field>]* | <field> = <value>
[WHERE <condition>]

1.2 UPDATE特点 #

text
UPDATE特点:
├── 支持条件更新
├── 支持原子操作
├── 支持批量更新
├── 支持UPSERT模式
└── 返回更新结果

二、基本更新 #

2.1 使用SET语法 #

sql
UPDATE Person SET name = 'Tom Hanks' WHERE name = 'Tom'

2.2 更新多个字段 #

sql
UPDATE Person SET 
    name = 'Tom Hanks',
    age = 31,
    city = 'Shanghai'
WHERE @rid = #12:0

2.3 使用RID更新 #

sql
UPDATE #12:0 SET name = 'Tom Hanks', age = 31

2.4 更新并返回 #

sql
UPDATE Person SET age = age + 1 WHERE name = 'Tom' RETURN AFTER @rid, name, age
UPDATE Person SET age = age + 1 WHERE name = 'Tom' RETURN AFTER @this

2.5 返回更新前后值 #

sql
UPDATE Person SET age = age + 1 WHERE name = 'Tom' 
RETURN BEFORE @rid, BEFORE age AS oldAge, AFTER age AS newAge

三、条件更新 #

3.1 使用WHERE条件 #

sql
UPDATE Person SET status = 'inactive' WHERE age > 60
UPDATE Person SET level = 'senior' WHERE age >= 60 AND yearsOfService >= 20
UPDATE Person SET status = 'verified' WHERE email LIKE '%@company.com'

3.2 使用IN条件 #

sql
UPDATE Person SET status = 'active' WHERE @rid IN [#12:0, #12:1, #12:2]
UPDATE Person SET department = 'IT' WHERE name IN ['Tom', 'Jerry', 'Mike']

3.3 使用子查询条件 #

sql
UPDATE Person SET bonus = 1000 
WHERE @rid IN (SELECT @rid FROM Person WHERE performance = 'excellent')

3.4 使用链接条件 #

sql
UPDATE Person SET status = 'employee' 
WHERE employer = (SELECT FROM Company WHERE name = 'ABC Corp')

四、原子操作 #

4.1 数值增减 #

sql
UPDATE Person SET age = age + 1 WHERE name = 'Tom'
UPDATE Product SET stock = stock - 1 WHERE @rid = #15:0
UPDATE Account SET balance = balance + 100.00 WHERE accountId = 'A001'

4.2 使用表达式 #

sql
UPDATE Product SET price = price * 1.1 WHERE category = 'electronics'
UPDATE Person SET score = score * 2 + bonus WHERE status = 'active'

4.3 条件表达式 #

sql
UPDATE Person SET level = 
    CASE 
        WHEN age < 18 THEN 'junior'
        WHEN age < 60 THEN 'senior'
        ELSE 'expert'
    END

4.4 使用IF函数 #

sql
UPDATE Person SET status = IF(score >= 60, 'pass', 'fail') WHERE examId = 'E001'

五、集合操作 #

5.1 ADD添加元素 #

sql
UPDATE Person ADD hobbies = 'swimming' WHERE name = 'Tom'
UPDATE Person ADD tags = 'expert' WHERE @rid = #12:0

5.2 REMOVE移除元素 #

sql
UPDATE Person REMOVE hobbies = 'gaming' WHERE name = 'Tom'
UPDATE Person REMOVE tags = 'beginner' WHERE @rid = #12:0

5.3 更新整个集合 #

sql
UPDATE Person SET hobbies = ['reading', 'coding', 'swimming'] WHERE name = 'Tom'
UPDATE Person SET tags = {'developer', 'expert', 'mentor'} WHERE @rid = #12:0

5.4 MAP操作 #

sql
UPDATE Person PUT preferences = 'fontSize', 'large' WHERE name = 'Tom'
UPDATE Person REMOVE preferences['timezone'] WHERE name = 'Tom'
UPDATE Person SET preferences = {'theme': 'dark', 'language': 'en'} WHERE name = 'Tom'

5.5 集合合并 #

sql
UPDATE Person SET hobbies = hobbies || ['swimming', 'hiking'] WHERE name = 'Tom'

六、链接操作 #

6.1 更新链接 #

sql
UPDATE Person SET employer = (SELECT FROM Company WHERE name = 'ABC Corp') WHERE name = 'Tom'

6.2 添加链接 #

sql
UPDATE Person ADD friends = (SELECT FROM Person WHERE name = 'Jerry') WHERE name = 'Tom'

6.3 移除链接 #

sql
UPDATE Person REMOVE friends = (SELECT FROM Person WHERE name = 'Mike') WHERE name = 'Tom'

6.4 批量更新链接 #

sql
UPDATE Person SET employer = (SELECT FROM Company WHERE name = 'ABC Corp') 
WHERE employer IS NULL

七、UPSERT操作 #

7.1 基本UPSERT #

sql
UPDATE Person SET name = 'Tom', age = 30 UPSERT WHERE email = 'tom@example.com'

7.2 条件UPSERT #

sql
UPDATE Person SET 
    name = 'Tom',
    age = 30,
    updatedAt = sysdate()
UPSERT 
WHERE email = 'tom@example.com'

7.3 UPSERT返回 #

sql
UPDATE Person SET name = 'Tom' UPSERT WHERE email = 'tom@example.com' RETURN @rid, @version

八、批量更新 #

8.1 更新所有记录 #

sql
UPDATE Person SET status = 'active'

8.2 限制更新数量 #

sql
UPDATE Person SET status = 'processed' LIMIT 100

8.3 分批更新 #

sql
LET batch = SELECT FROM Person WHERE status = 'pending' LIMIT 100;
UPDATE $batch SET status = 'processed'

8.4 使用UNWIND批量更新 #

sql
LET updates = [
    {'rid': #12:0, 'name': 'Tom'},
    {'rid': #12:1, 'name': 'Jerry'},
    {'rid': #12:2, 'name': 'Mike'}
]
FOREACH ($item IN $updates) {
    UPDATE $item.rid SET name = $item.name
}

九、更新顶点和边 #

9.1 更新顶点 #

sql
UPDATE Person SET name = 'Tom Hanks', age = 31 WHERE @rid = #12:0

9.2 更新边属性 #

sql
UPDATE KNOWS SET since = 2021, level = 'close' WHERE @rid = #25:0

9.3 批量更新边 #

sql
UPDATE KNOWS SET active = true WHERE out.name = 'Tom' AND in.name = 'Jerry'

十、事务中更新 #

10.1 基本事务 #

sql
BEGIN
UPDATE Account SET balance = balance - 100 WHERE id = 'A001'
UPDATE Account SET balance = balance + 100 WHERE id = 'A002'
INSERT INTO Transaction SET fromAccount = 'A001', toAccount = 'A002', amount = 100
COMMIT

10.2 条件事务 #

sql
BEGIN
LET account = SELECT FROM Account WHERE id = 'A001'
IF ($account[0].balance >= 100) {
    UPDATE Account SET balance = balance - 100 WHERE id = 'A001'
    UPDATE Account SET balance = balance + 100 WHERE id = 'A002'
    COMMIT
} ELSE {
    ROLLBACK
    SELECT 'Insufficient balance' AS error
}

十一、版本控制 #

11.1 检查版本 #

sql
SELECT @rid, @version FROM Person WHERE name = 'Tom'

11.2 乐观锁更新 #

sql
UPDATE Person SET name = 'Tom Hanks' WHERE @rid = #12:0 AND @version = 5

11.3 版本冲突处理 #

sql
TRY {
    UPDATE Person SET name = 'Tom Hanks' WHERE @rid = #12:0 AND @version = 5
} CATCH {
    SELECT 'Version conflict, please retry' AS error
}

十二、更新性能优化 #

12.1 使用索引 #

sql
CREATE INDEX Person.email UNIQUE
UPDATE Person SET status = 'active' WHERE email = 'tom@example.com'

12.2 批量更新优化 #

sql
BEGIN
UPDATE Person SET status = 'active' WHERE status = 'pending' LIMIT 1000
COMMIT

12.3 避免全表更新 #

sql
UPDATE Person SET status = 'active' WHERE status = 'inactive'

十三、实际应用示例 #

13.1 更新用户信息 #

sql
UPDATE User SET 
    firstName = 'Tom',
    lastName = 'Hanks',
    email = 'tom.hanks@example.com',
    updatedAt = sysdate()
WHERE id = 'user_001'
RETURN AFTER @rid, firstName, lastName, email

13.2 库存扣减 #

sql
UPDATE Product SET 
    stock = stock - 1,
    updatedAt = sysdate()
WHERE id = 'prod_001' AND stock > 0
RETURN AFTER @rid, stock

13.3 状态流转 #

sql
UPDATE Order SET 
    status = 'shipped',
    shippedAt = sysdate(),
    updatedAt = sysdate()
WHERE id = 'order_001' AND status = 'paid'
RETURN AFTER @rid, status

13.4 批量状态更新 #

sql
UPDATE Log SET archived = true 
WHERE createdAt < sysdate() - 30 AND archived = false
LIMIT 10000

13.5 计数器更新 #

sql
UPDATE Counter SET value = value + 1 WHERE name = 'page_views'
UPDATE User SET loginCount = loginCount + 1, lastLoginAt = sysdate() WHERE id = 'user_001'

十四、错误处理 #

14.1 常见错误 #

text
常见错误:
├── 记录不存在
├── 版本冲突
├── 违反约束
├── 类型不匹配
└── 权限不足

14.2 错误处理示例 #

sql
TRY {
    UPDATE Person SET name = 'Tom' WHERE @rid = #12:0
} CATCH {
    SELECT 'Update failed: ' + $error AS message
}

十五、总结 #

更新文档要点:

操作 语法 说明
基本更新 UPDATE … SET 设置字段值
原子操作 SET field = field + n 数值增减
集合添加 ADD 添加集合元素
集合移除 REMOVE 移除集合元素
UPSERT UPDATE … UPSERT 存在则更新,不存在则插入
条件更新 WHERE 条件过滤

下一步,让我们学习删除文档!

最后更新:2026-03-27