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

  • 相关阅读:
    mq概念
    Mac Xampp 安装redis 及 安装php-redis扩展
    rabbitmq死信队列(延迟队列)demo
    rabbitmq生产与消费测试
    RabbitMQ各方法详解
    Mac git old mode 100644 new mode 100755 mac目录权限问题
    mac安装redis
    msql创建用户并授权
    mac apache php 访问失败
    Kubernetes入门学习--在Ubuntu16.0.4安装配置Minikube
  • 原文地址:https://www.cnblogs.com/njqa/p/7826992.html
Copyright © 2011-2022 走看看