删除文档 #

一、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