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语句的优先级问题?   

  • 相关阅读:
    Don't set high speed for the 'DoubleClick'
    How to set UITextField to ReadOnly
    Parallel World 1 并行世界的两个基本问题
    Parallel World 3 – Parallel Loop (2)
    hdu 2680 Choose the best route Dijkstra 虚拟点
    hdu 2255 KM算法
    最小生成树 kruskal 和 pime 模版
    hdu 1863 畅通工程 最小生成树+并查集
    hdu 2603 过山车 最大匹配,匈牙利算法模板(易理解)
    KM 最优匹配 讲解
  • 原文地址:https://www.cnblogs.com/njqa/p/7826992.html
Copyright © 2011-2022 走看看