错误示例
<delete id="deleteOldRelations">
DELETE FROM departments_closure_table
WHERE descendant IN (
SELECT descendant FROM departments_closure_table
WHERE ancestor = #{departmentId}
)
</delete>
程序运行之后,会报错:You can't specify target table 'departments_closure_table' for update in FROM clause; nested exception is java.sql.SQLException: You can't specify target table 'departments_closure_table' for update in FROM clause] with root cause
错误原因
这个语句违反了MySQL的语法规则,因为它试图在一个DELETE语句的FROM子句中引用了正在更新的表departments_closure_table
。在MySQL中,你不能在一个DML(数据操纵语言,如INSERT, UPDATE, DELETE
)语句中直接引用目标表进行子查询。
如何解决
解决办法由ChatGPT生成。
可以通过以下步骤解决这个问题:
- 先查询出需要删除的
descendant
列表并存储在临时表中。 - 再删除临时表中的这些
descendant
。
修正后的 SQL
- 创建临时表并存储需要删除的
descendant
列表:
<insert id="createTempTable" parameterType="