MySql 使用递归函数时遇到的级联删除问题
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySql 使用递归函数时遇到的级联删除问题,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1466字,纯文字阅读大概需要3分钟。
内容图文
以下两段SQL的写法看似相同,结果效果却是不同的
写法A:
DELETE OM_ORGANIZATION, OM_POSITION FROM OM_ORGANIZATION LEFT JOIN OM_POSITION ON OM_POSITION.ORG_ID = OM_ORGANIZATION.ORG_ID WHERE FIND_IN_SET( OM_ORGANIZATION.ORG_ID, OM_ORGANIZATION_QUERY_CHILDREN (‘52037b7c-0f01-41f6-849f-4f99ad8f2422‘) )
这个写法是不正确的,先来介绍一下这个
OM_ORGANIZATION_QUERY_CHILDREN
函数
BEGIN DECLARE sTemp VARCHAR(4000); DECLARE sTempChd VARCHAR(4000); SET sTemp =‘$‘; SET sTempChd = id; WHILE sTempChd isnotNULL DO SET sTemp = CONCAT(sTemp,‘,‘,sTempChd); SELECT group_concat(ORG_ID) INTO sTempChd FROM OM_ORGANIZATION where FIND_IN_SET(PARENT_ORG_ID,sTempChd)>0; ENDWHILE; return sTemp; END
id(VARCHAR(40))是这个函数的参数
这个函数的执行结果是返回一个拼起来的字符串,字符串根据主键ORG_ID、父节点主键PARENT_ORG_ID两个字段,递归查询出OM_ORGANIZATION中所有以传入参数作为根节点的主键,然后拼成一个类似 【1,2,3,4】的可供FIND_IN_SET使用的字符串(这里定义成VARCHAR(4000))。
写法A中:每删除一条数据都有可能造成OM_ORGANIZATION_QUERY_CHILDREN (‘1‘)这个函数的执行结果变化,
假设删除第一条的时候,这个函数的执行结果是【1,2,3】,其中’2‘的父节点是’1‘,’3‘的父节点也是’1‘,那么在删除完’2‘之后,函数的结果变成了【1,3】,而后边与’2‘存在关系的OM_POSITION就无法被删掉了。
正确的写法应该如下:
写法B:
DELETE OM_ORGANIZATION, OM_POSITION FROM ( SELECT ORG_ID FROM OM_ORGANIZATION WHERE FIND_IN_SET( OM_ORGANIZATION.ORG_ID, OM_ORGANIZATION_QUERY_CHILDREN ( ‘ 52037b7c-0f01-41f6-849f-4f99ad8f2422 ‘ ) ) ) T INNER JOIN OM_ORGANIZATION ON T.ORG_ID = OM_ORGANIZATION.ORG_ID LEFTJOIN OM_POSITION ON OM_POSITION.ORG_ID = OM_ORGANIZATION.ORG_ID
这样,函数只执行一遍,其结果将一直保持不变,直到SQL结束。不仅提高了效率,还避免了错误。
原文:http://www.cnblogs.com/flying607/p/4854048.html
内容总结
以上是互联网集市为您收集整理的MySql 使用递归函数时遇到的级联删除问题全部内容,希望文章能够帮你解决MySql 使用递归函数时遇到的级联删除问题所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。