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、感受:

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

  • 相关阅读:
    Oracle SQL语句收集
    SqlParameter In 查询
    SQL 性能优化
    Entity Framework
    【XLL API 函数】 xlfSetName
    【XLL API 函数】xlfUnregister (Form 2)
    【XLL API 函数】xlfUnregister (Form 1)
    【Excel 4.0 函数】REGISTER 的两种形式以及VBA等效语句
    【Excel 4.0 函数】REGISTER
    【Bochs 官方手册翻译】 第一章 Bochs介绍
  • 原文地址:https://www.cnblogs.com/xmqa/p/8549647.html
Copyright © 2011-2022 走看看