执行Couchbase DELETE语句触发3000错误,请求协助排查原因
Couchbase DELETE语句触发3000错误的原因及修正方案
你的DELETE语句触发3000错误的核心原因是N1QL不支持在DELETE的WHERE子句中直接用多字段元组(id, documentType)搭配IN操作符匹配子查询结果,虽然子查询本身能正常返回符合要求的元组,但这种写法违反了N1QL的语法规范,导致解析报错。
要实现删除重复(id, documentType)组合文档的需求,你可以换成EXISTS子查询的写法,这是N1QL支持的关联判断方式:
修正后的语句写法1
DELETE FROM runtime AS r WHERE EXISTS ( SELECT 1 FROM runtime AS r2 WHERE r2.id = r.id AND r2.documentType = r.documentType GROUP BY r2.id, r2.documentType HAVING COUNT(*) > 1 );
更高效的写法(先预存重复组合)
WITH duplicates AS ( SELECT id, documentType FROM runtime WHERE id IS NOT MISSING AND documentType IS NOT MISSING GROUP BY id, documentType HAVING COUNT(*) > 1 ) DELETE FROM runtime AS r WHERE EXISTS ( SELECT 1 FROM duplicates AS d WHERE d.id = r.id AND d.documentType = r.documentType );
这两种写法都是通过EXISTS判断当前文档的id和documentType是否属于重复组合,完全符合N1QL语法规则,能正常执行删除操作。
内容的提问来源于stack exchange,提问作者Lior Cohen
相关产品推荐
相关产品推荐

