更新文档 #
一、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