AQL嵌套UPSERT报错variable '$OLD' is assigned multiple times如何解决
报错原因
ArangoDB AQL 语法中,UPSERT 语句默认会在当前作用域自动生成 $OLD(匹配到的已有文档,无匹配则为null)和 $NEW(插入/更新完成后的文档)两个固定命名的临时变量,同作用域内使用多个 UPSERT 时会触发变量重复声明的报错。
解决方案
给每个 UPSERT 语句指定自定义变量接收执行结果,替代默认的 $OLD/$NEW 即可避免命名冲突,多层嵌套时每层指定不同的自定义变量名即可。
修正后的可运行代码如下:
FOR sport IN ${data} FOR country IN sport.C FOR league IN country.L // 第一个UPSERT指定自定义变量接收结果,避免生成默认的$OLD/$NEW UPSERT { I: league.I } INSERT { I: league.I, C: country.I, S: sport.I } UPDATE { I: league.I, C: country.I, S: sport.I } IN leagues INTO leagueUpsertResult FOR event IN league.E // 第二个UPSERT也指定独立的自定义变量 UPSERT { I: event.I } INSERT { I: event.I, L: league.I } UPDATE { I: event.I, L: league.I } IN events INTO eventUpsertResult
如果后续还有更多层级的嵌套更新,只需要给每一层的 UPSERT 配置不同的自定义接收变量名即可正常使用,上层循环的变量取值逻辑完全不受影响。
内容的提问来源于stack exchange,提问作者Burak OZ
相关产品推荐
相关产品推荐

