zoukankan      html  css  js  c++  java
  • Kettle循环删除数据

    1、问题描述:

      某个系统原库的数据同步到备份库。但是由于原库的的数据会物理删除,此时需要删除备份库的数据。

    2、不理想的解决1:

      1)首先从备份库获取该表的所有ID;

      2)循环备份库的ID,去原库检测下是否存在。不存在则表示原库已经物理删除,则删掉备份库对应的数据;原库存在则不处理备份库的数据。

      3)图示:

      

      说明点:

         3-1、“获取备份库数据”步骤:

        

           3-2、“获取遍历信息”步骤脚本:     

    var prevRow=previous_result.getRows();
    
    if (prevRow == null||(prevRow.size()==0)){
        false;
    
    }else{ 
    	parent_job.setVariable("data", prevRow);
    	parent_job.setVariable("size", prevRow.size());
    	parent_job.setVariable("i",0);
    
        true;
    }
    

       3-3、“获取遍历信息”步骤:

               

        3-4、“叠加器累计”步骤:  

    var data=parent_job.getVariable("data").replace("[","").replace("]","").split(",");//此处替换查询的数据特殊符号,并分割成数组。结果如:[[ID1],[ID2],[ID3],[ID4]...]
    var size = new Number(parent_job.getVariable("size"));
    var i = new Number(parent_job.getVariable("i"));
    
    if(i<size){
        parent_job.setVariable("id", data[i].trim());
    }
    parent_job.setVariable("i",i+1);//计数器+1
    true;
    

        3-5、“删”步骤:

      

        说明:此处做了假删,只是改变了数据状态。

                  Switch 判断del标志==0,时候才删除备份库。

                   select count(id) as del,'${id}' as id,'4' as c_data_status from table4 where EXISTS(select id from ${table} where id='${id}')

                     

    2、不理想的解决2:

      1)采用查询两个数据的ID对比,做switch case 判断,再决定是否删除备份库的数据。

              

      2)合并记录时候设置标志,然后根据标志判断

                 

    3、感受:

      设计数据库的时候若有其他业务,还是不要设计成物理删除为好。

  • 相关阅读:
    二分法查找
    重构方法之一:提炼方法(Extract Method)读书笔记
    使用SQL命令手动写入Discuz帖子内容
    调整linux系统时间和时区
    怎样给访问量过大的mysql数据库减压
    MySQL提示“too many connections”的解决办法
    CentOS 6安装php加速软件Zend Guard
    CmsTop 大众版运行环境搭建 (CentOS+Nginx+PHP FastCGI)
    LEMP构建高性能WEB服务器(CentOS+Nginx+PHP+MySQL)
    CentOS-6.3安装配置Nginx
  • 原文地址:https://www.cnblogs.com/xmqa/p/8549647.html
Copyright © 2011-2022 走看看