删除文档 #
一、DELETE语句概述 #
1.1 基本语法 #
sql
DELETE FROM <class>|RID|<query>
[WHERE <condition>]
[LIMIT <maxRecords>]
[RETURN <return-spec>]
1.2 DELETE特点 #
text
DELETE特点:
├── 支持条件删除
├── 支持批量删除
├── 支持级联删除
├── 返回删除结果
└── 支持事务
二、基本删除 #
2.1 使用WHERE条件 #
sql
DELETE FROM Person WHERE name = 'Tom'
2.2 使用RID删除 #
sql
DELETE FROM #12:0
DELETE FROM Person WHERE @rid = #12:0
2.3 删除并返回 #
sql
DELETE FROM Person WHERE name = 'Tom' RETURN @rid, name
DELETE FROM Person WHERE name = 'Tom' RETURN BEFORE @this
2.4 删除所有记录 #
sql
DELETE FROM Person
2.5 限制删除数量 #
sql
DELETE FROM Person WHERE status = 'inactive' LIMIT 100
三、条件删除 #
3.1 比较条件 #
sql
DELETE FROM Person WHERE age > 60
DELETE FROM Person WHERE age < 18 OR age > 65
DELETE FROM Log WHERE createdAt < DATE('2023-01-01')
3.2 IN条件 #
sql
DELETE FROM Person WHERE @rid IN [#12:0, #12:1, #12:2]
DELETE FROM Person WHERE name IN ['Tom', 'Jerry', 'Mike']
DELETE FROM Person WHERE status IN ['deleted', 'inactive']
3.3 LIKE条件 #
sql
DELETE FROM Person WHERE email LIKE '%@temp.com'
DELETE FROM Log WHERE message LIKE '%error%'
3.4 NULL条件 #
sql
DELETE FROM Person WHERE email IS NULL
DELETE FROM Person WHERE phone IS NULL AND address IS NULL
3.5 子查询条件 #
sql
DELETE FROM Person WHERE @rid IN (
SELECT @rid FROM Person WHERE lastLoginAt < DATE('2022-01-01')
)
3.6 链接条件 #
sql
DELETE FROM Person WHERE employer = (SELECT FROM Company WHERE name = 'Closed Corp')
DELETE FROM Order WHERE customer = (SELECT FROM Customer WHERE status = 'deleted')
四、批量删除 #
4.1 删除所有匹配记录 #
sql
DELETE FROM Log WHERE level = 'DEBUG'
4.2 分批删除 #
sql
LET batch = SELECT FROM Log WHERE createdAt < DATE('2023-01-01') LIMIT 1000;
DELETE FROM $batch
4.3 循环批量删除 #
sql
LET total = SELECT COUNT(*) FROM Log WHERE createdAt < DATE('2023-01-01');
LET deleted = 0;
WHILE ($deleted < $total) {
DELETE FROM Log WHERE createdAt < DATE('2023-01-01') LIMIT 1000;
LET deleted = $deleted + 1000;
}
4.4 使用UNWIND批量删除 #
sql
LET rids = SELECT @rid FROM Person WHERE status = 'deleted';
FOREACH ($rid IN $rids) {
DELETE FROM $rid.@rid
}
五、删除顶点和边 #
5.1 删除顶点 #
sql
DELETE VERTEX Person WHERE name = 'Tom'
或使用DELETE FROM:
sql
DELETE FROM Person WHERE name = 'Tom'
5.2 级联删除顶点 #
sql
DELETE VERTEX Person WHERE @rid = #12:0
注意:删除顶点会自动删除关联的边。
5.3 删除边 #
sql
DELETE EDGE KNOWS WHERE @rid = #25:0
DELETE EDGE KNOWS WHERE out.name = 'Tom' AND in.name = 'Jerry'
5.4 删除所有边 #
sql
DELETE EDGE KNOWS
DELETE EDGE WHERE @class = 'KNOWS'
5.5 删除顶点的所有边 #
sql
DELETE EDGE FROM (SELECT FROM Person WHERE name = 'Tom')
DELETE EDGE TO (SELECT FROM Person WHERE name = 'Tom')
六、级联删除 #
6.1 自动级联删除 #
text
自动级联场景:
├── 删除顶点时自动删除关联边
├── 删除类时可选级联删除记录
└── 需要配置或使用特定语法
6.2 手动级联删除 #
sql
BEGIN
DELETE EDGE WORKS_AT WHERE out = #12:0
DELETE FROM Person WHERE @rid = #12:0
COMMIT
6.3 删除关联数据 #
sql
LET person = SELECT FROM Person WHERE name = 'Tom';
BEGIN
DELETE FROM Order WHERE customer = $person[0].@rid
DELETE EDGE FROM $person[0].@rid
DELETE FROM $person[0].@rid
COMMIT
七、软删除 #
7.1 软删除概念 #
软删除不真正删除记录,而是标记为已删除:
sql
UPDATE Person SET deletedAt = sysdate(), isDeleted = true WHERE name = 'Tom'
7.2 查询时过滤软删除 #
sql
SELECT FROM Person WHERE isDeleted = false OR isDeleted IS NULL
7.3 恢复软删除 #
sql
UPDATE Person SET deletedAt = NULL, isDeleted = false WHERE @rid = #12:0
7.4 永久删除软删除记录 #
sql
DELETE FROM Person WHERE isDeleted = true AND deletedAt < sysdate() - 30
八、事务中删除 #
8.1 基本事务 #
sql
BEGIN
DELETE FROM OrderItem WHERE orderId = 'order_001'
DELETE FROM Order WHERE id = 'order_001'
COMMIT
8.2 条件事务 #
sql
BEGIN
LET order = SELECT FROM Order WHERE id = 'order_001' AND status = 'cancelled';
IF ($order.size() > 0) {
DELETE FROM OrderItem WHERE orderId = 'order_001'
DELETE FROM Order WHERE id = 'order_001'
COMMIT
} ELSE {
ROLLBACK
SELECT 'Cannot delete order' AS error
}
8.3 回滚示例 #
sql
BEGIN
DELETE FROM Person WHERE name = 'Tom'
LET count = SELECT COUNT(*) FROM Person WHERE name = 'Tom';
IF ($count = 0) {
COMMIT
} ELSE {
ROLLBACK
}
九、删除验证 #
9.1 删除前检查 #
sql
LET count = SELECT COUNT(*) FROM Person WHERE name = 'Tom';
IF ($count > 0) {
DELETE FROM Person WHERE name = 'Tom' RETURN @rid
} ELSE {
SELECT 'No records found' AS message
}
9.2 删除后验证 #
sql
DELETE FROM Person WHERE name = 'Tom' RETURN @rid;
SELECT COUNT(*) AS remaining FROM Person WHERE name = 'Tom'
9.3 删除统计 #
sql
LET before = SELECT COUNT(*) AS total FROM Person WHERE status = 'inactive';
DELETE FROM Person WHERE status = 'inactive' RETURN COUNT(@rid) AS deleted;
SELECT $before.total AS beforeCount, $deleted AS deletedCount
十、TRUNCATE操作 #
10.1 清空类 #
sql
TRUNCATE CLASS Person
10.2 清空集群 #
sql
TRUNCATE CLUSTER person_cluster
10.3 TRUNCATE vs DELETE #
| 操作 | TRUNCATE | DELETE |
|---|---|---|
| 速度 | 更快 | 较慢 |
| 条件 | 不支持 | 支持 |
| 返回 | 不返回 | 可返回 |
| 事务 | 不支持 | 支持 |
| 触发器 | 不触发 | 触发 |
十一、删除性能优化 #
11.1 使用索引 #
sql
CREATE INDEX Person.email UNIQUE
DELETE FROM Person WHERE email = 'tom@example.com'
11.2 分批删除 #
sql
LET batchSize = 1000;
LET total = SELECT COUNT(*) FROM Log WHERE createdAt < DATE('2023-01-01');
LET iterations = CEIL($total / $batchSize);
FOR $i IN RANGE(0, $iterations - 1) {
DELETE FROM Log WHERE createdAt < DATE('2023-01-01') LIMIT $batchSize;
}
11.3 禁用索引临时 #
sql
ALTER INDEX Person.name DISABLE
DELETE FROM Person WHERE status = 'deleted'
ALTER INDEX Person.name ENABLE
十二、删除安全 #
12.1 权限控制 #
sql
GRANT DELETE ON database.Person TO role_user
12.2 删除前备份 #
sql
LET backup = SELECT FROM Person WHERE name = 'Tom';
INSERT INTO PersonBackup FROM $backup;
DELETE FROM Person WHERE name = 'Tom'
12.3 删除确认 #
sql
LET record = SELECT FROM Person WHERE @rid = #12:0;
SELECT 'Confirm delete: ' + $record[0].name AS message;
DELETE FROM Person WHERE @rid = #12:0
十三、实际应用示例 #
13.1 删除用户 #
sql
BEGIN
LET user = SELECT FROM User WHERE id = 'user_001';
DELETE FROM UserSession WHERE userId = $user[0].@rid;
DELETE FROM UserPreference WHERE userId = $user[0].@rid;
DELETE EDGE FROM $user[0].@rid;
DELETE VERTEX User WHERE id = 'user_001';
COMMIT
13.2 清理过期数据 #
sql
DELETE FROM Session WHERE expiresAt < sysdate()
DELETE FROM Token WHERE expiresAt < sysdate()
DELETE FROM Log WHERE createdAt < sysdate() - 90
13.3 删除测试数据 #
sql
DELETE FROM Person WHERE email LIKE '%@test.com'
DELETE FROM Order WHERE status = 'test'
DELETE FROM Log WHERE environment = 'test'
13.4 批量删除归档 #
sql
LET archived = SELECT FROM Log WHERE createdAt < DATE('2023-01-01') LIMIT 10000;
INSERT INTO LogArchive FROM $archived;
DELETE FROM Log WHERE @rid IN (SELECT @rid FROM $archived)
十四、错误处理 #
14.1 常见错误 #
text
常见错误:
├── 记录不存在
├── 外键约束冲突
├── 权限不足
├── 事务冲突
└── 锁定超时
14.2 错误处理示例 #
sql
TRY {
DELETE FROM Person WHERE @rid = #12:0
} CATCH {
SELECT 'Delete failed: ' + $error AS message
}
十五、总结 #
删除文档要点:
| 操作 | 语法 | 说明 |
|---|---|---|
| 条件删除 | DELETE FROM … WHERE | 按条件删除 |
| RID删除 | DELETE FROM #rid | 按RID删除 |
| 顶点删除 | DELETE VERTEX | 删除顶点及边 |
| 边删除 | DELETE EDGE | 删除边 |
| 清空类 | TRUNCATE CLASS | 清空所有记录 |
| 软删除 | UPDATE … SET isDeleted | 标记删除 |
下一步,让我们学习基础查询!
最后更新:2026-03-27