zoukankan      html  css  js  c++  java
  • sql语句: update和sql函数的冲突

    事情场景:  前端使用z-tree插件,需要执行一个删除操作,那么当前节点以及其子节点都要被删除。

    方法论:

    1.可以在前端做节点向下遍历,生成节点id集合,传给后端,后端mybatis for循环删除即可。

    2.可以只穿递当前节点的id,然后用java去数据库中先递归查,构造id集合,然后再删除(回到第一种方法了)   感觉多此一举。

    3.直接用sql函数, 前端只传递当前id,sql函数根据当前id来进行表遍历,找到满足条件的id集合,然后update即可。  (项目实际使用方案

     sql函数:

    CREATE DEFINER=`xxxxx`@`%` FUNCTION `queryChildrenDocNode`(
    	`nodeId` INT
    )
    RETURNS varchar(1000) CHARSET utf8
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
    BEGIN
    DECLARE sTemp VARCHAR(5000);
    DECLARE sTempChd VARCHAR(1000);
    
    SET sTemp='$';
    SET sTempChd = CAST(nodeId AS CHAR);
    
    WHILE sTempChd IS NOT NULL DO
    SET sTemp= CONCAT(sTemp,',',sTempChd);
    SELECT GROUP_CONCAT(id) INTO sTempChd FROM 表名 WHERE FIND_IN_SET(pid,sTempChd)>0 and delete_flag = 1;
    END WHILE;
    RETURN sTemp;
    END  
    ### mybatis  mapper语句
    <update id="deleteDocInfoById" parameterType="java.lang.Long">
      UPDATE 表名
      SET delete_flag = 1
      where find_in_set(id,queryChildrenDocNode(#{id}))
    </update>
    

      

    使用此sql函数后,update只能更新两条记录,最后定位问题后发现,是因为上图中的红色字段导致的,删掉红色字段,即可!  

    猜想:可能是由于sql函数和update都操作同一个字段delete_flag导致的, 估计是sql语句的优先级问题?   

  • 相关阅读:
    StackExchange.Redis 使用 (一)
    委托的一个小问题
    MemberwishClone学习
    类的内容学习
    类的学习
    构造函数学习
    C# 重新筑基-从头开始
    C语言入门:结构体+文件的应用
    C语言入门:结构体的概要
    C语言入门:指针的概要
  • 原文地址:https://www.cnblogs.com/njqa/p/7826992.html
Copyright © 2011-2022 走看看