由于LZ很像整理一下如何使用Kettle对一张表进行增量更新的时候,

同时实现对数据库中的其他表也可以实现相关的更新操作。

第一种方法想使用触发器,即在相应的hop之间添加SQL脚本step然后在step中实现对其他数据表进行比照更新的相关操作。

另一种方法是,时间戳,可以添加时间点,然后通过判断时间点是否变更来判断数据进行了相关的变动。

其实还有一种方法就是分析日志,这个对我来说暂时还是有些难度了,数据库针对性也很强,所以先自动过滤掉吧~

但是想到,

如果在kettle 中不对其进行额外设定step的操作,在更新一张表的时候

与之相关的表中对应的字段是否会根据该字段中的:变更而自动更新,删除而自动变为空等等一些操作。

先说一下结果吧:在kettle中 如果两张表仅仅靠foreign key constraint 这种约束的话,

其中主表的外键是附表的主键(也就是主表对应该字段的数值是附表对应该字段数值集合的子集),

如果在附表中进行数据更新,

则在主表中的字段不会随之更新,而是会报错的。

所以,接下来只能是自己写触发器了,来实现同步多个相连的表的同步更新了。

下面是LZ所创建的实验表和相关的数据:

首先,在mysql数据库中创建相应的数据库作为带被更新的旧数据源:

create database test7_26;

use test7_26;
create table class
(
classId int not null,
className varchar(50) not null,
primary key(classId)
); create table stu
(
id  int not null,
name varchar(50) not null,
primary key (id),
classId int not null,
key  classId (classId),
constraint id_to_class foreign key(classId)
references  class(classId)
);

insert into class values(2310,'chinese'),(2308,'physical'),(2511,'eng'),(2191,'PE'),(2383,'chemical'),(2276,'music'),

(1961,'photoshop'),(2792,'flash'),(1632,'computer'),(3216,'history');

insert into stu values(100,'inuyasha', 2310),(102, 'kokia',2308),(209,'kagome',2511),(90,'natsume',2191),(98,'kikiyou',2383),(133,'tegomass',2276);

 

由于两张表之间存在约束,所以应该首先创建附表class。

并且在插入数据的时候也应该先向附表中插入数据。

然后在创建一个数据库,作为新数据源,

在其中为了方便仅仅创建一个class表,

(因为在新数据源中创建stu表在本实验中根本没有用途,所以不创建)

在class表中进行相关数据的变更。

然后使用kettle同步两个数据源中的两张class表,

看旧数据源中的stu对应字段是否会相应的进行变动。

下面是新数据源的创建语句:

create test7_26_new;

use test7_26_new;

create table class
(
classId int not null,
className varchar(50) not null,
primary key(classId)
); insert class values(12402,'new class'),
(2191,'PE'),(2383,'chemical'),(2276,'economic_changed'),
(1961,'photoshop_changed'),(2792,'flash'),(1632,'computer'),
(3216,'history'),(480604, 'operating system_new');

//(12402,'new class'),(480604, 'operating system_new')=>对应的是new
//(1961,'photoshop_changed'),(2276,'economic_changed')=>对应的是changed
//(2310,'chinese'),(2308,'physical'),(2511,'eng');=>对应的是deleted
//其余对应的是identical

其中new,changed,deleted的对应记录在旧数据源同步之后并不会对旧数据源中的stu表进行相应的更改,

这也不是本实验的重点。

本实验的重点事项测试deleted旧数据源的class表中相关字段之后,

与之相关的(100,'inuyasha', 2310),(102, 'kokia',2308),(209,'kagome',2511),

这三条旧数据源中stu表中的三条记录的classId这一字段将会如何变更,

是否会进行相关的级联自动更新变更操作。

根据前一篇的具体介绍,首先在Kettle中新建一个转换:

整体流程截图:

接下来创建两个数据库连接,

分别对应mysql数据库的test7_26;test7_26_new;

(图)

接下来拖拽两个表输入,

分别对应test7_26.class和test7_26_new.class

test7_26_new.class:

(我用画图工具铅笔写的,比用脚写的还难看,哈哈哈哈,

cg对应的是这些字段是会出现changed的,在合并记录之后)

接下来将二者记性排序处理

(仅对classId进行排序就可以,

因为排序是为了提高合并记录的效率,

而后面的合并记录仅仅是针对classId

进行新旧数据源的比对,

所以只对classId进行相应的比对就可以的)

,然后进行合并记录,然后查看一下结果;

结果与设想的一致。

然后进行增加数据同步step操作。

下面是对step进行相应的字段设定:

如果不考虑错误的话,可以在相应的同步数据的后面加上一个日志处理step,

可以强制执行对旧数据源的数据表class进行更新,

由于有级联对class和stu相连接,所以可以对class中的相应字段进行插入更新,

而对应的deleted字段并不会相应的执行从旧数据源的class中delete相应记录的操作。

所以,stu中对应字段不进行改变:

下图分别是整体流程的设计和执行后使用mysql控制台显示数据库test7_26;旧数据源中,

数据表stu对应字段的更新的情况:

如果没有外键约束对应的三条画红勾的对应的三条记录应该被从旧数据源

table:class中被移除。

这一点与设想的不一致。

但是合并记录对应为new的三条记录:

new class

oper system new却被成功的同步进去了。

这一点与设想的一致。

接下来还是,乖乖的使用快照方式以及触发器来实现同步数据吧~

虽说这次试验思路真的是挺简单的,

但是操作起来还是不顺手,有很多方法思想也不主流。

希望以后对这门技术更加的精通,呵呵。

还有很多东西要学习呢,加油吧~

测试Kettle在增量更新的时候是否支持级联——不支持(基于mysql)的更多相关文章

  1. kettle教程---增量更新

    以下操作都在5.0.1版本下进行开发,其余版本可以进行自动比对 在平时工作当中,会遇到这种情况,而且很常见.比如:增量抽取(每隔2个小时抽取截至到上次抽取时间的记录) 一.操作前提: 存在3张表,源表 ...

  2. Kettle中通过触发器方式实现数据 增量更新

    在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法. 实验的思路是这样 ...

  3. kettle教程---通过配置表格配置实现数据的批量增量更新(实用)

    本文接上篇文章,上面文章讲的是,通过配置文件的全量更新,现在说下增量更新 如上图所示,涉及到1个转换和1个作业. 1-表增量同步(转换) 可以通过读取同步表参数这个excel表格文件,获取表名称和同步 ...

  4. SSIS Design2:增量更新

    一般来说,ETL实现增量更新的方式有两种,第一种:记录字段的最大值,如果数据源中存在持续增加的数据列,记录上次处理的数据集中,该列的最大值:第二种是,保存HashValue,快速检查所有数据,发现异动 ...

  5. [转载]BW增量更新的理解(时间戳)

    在BW中,存在两种数据抽取方式,完全更新与增量更新,完全更新是每次把截至到某个时间的数据全部抽取,增量抽取则只抽取上次和本次抽取之间更新的数据,很显然,增量抽取能够提高系统效率,根据SAP帮 助的说法 ...

  6. 增量更新项目时的备份MyBak

    在增量更新项目时,做好备份十分重要,这里提供一个方法备份java Web所更新的文件. 把更新包放在指定目录,配好如下webappFolder.updateFolder以及bakeupFolder的路 ...

  7. SSIS 实例 从Ftp获取多个文件并对数据库进行增量更新。

    整个流程 Step 1 放置一个FTP Task 将远程文件复制到本地 建立FTP链接管理器后 Is LocalPatchVariable 设置为Ture 并创建一个变量设置本地路径 Operatio ...

  8. [译]Stairway to Integration Services Level 4 - 增量更新数据

    在本文中, 我们说下增量更新数据:即将数据源中更新了的数据替换掉目标表中对应的数据. 更新代码 操作之前我们先把目标表e (dbo.Contact). 的数据改掉 Use AdventureWorks ...

  9. Android 增量更新实例(Smart App Updates)

    原地址:http://my.oschina.net/liucundong/blog/160436 官方说明 实现原理 实现 (1)生成差异包 (2)使用旧apk+差异包,在客户端合成新apk 注意事项 ...

随机推荐

  1. struts2+jsp+jquery+Jcrop实现图片裁剪并上传

    <1> 使用html标签上传需要裁剪的大图. <2> 在页面呈现大图,使用Jcrop(Jquery)对大图进行裁剪,并且可以进行预览. <3> 选择好截取部分之后发 ...

  2. lc面试准备:Remove Duplicates from Sorted List

    1 题目 Given a sorted linked list, delete all duplicates such that each element appear only once. For ...

  3. 查看TEMP使用情况

    SQL> select * from v$mystat where rownum<2; SID STATISTIC#    VALUE ---------- ---------- ---- ...

  4. second blog编程之美------控制cpu曲线

    先贴程序: 以前看过这个算法, 不过没什么印象,大概记得它利用while循环来控制cpu利用率 #include int main(int argc,char*argv[]) {         wh ...

  5. Ehcache专栏

    http://www.iteye.com/blogs/subjects/ehcache

  6. Dubbo xml配置 和注解配置 写法

    <?xml version="1.0" encoding="UTF-8"?><!-- - Copyright 1999-2011 Alibab ...

  7. mac 别名 ll

    在 Linux 下习惯使用 ll.la.l 等ls别名的童鞋到 mac os 可就郁闷了~~ 其实只要在用户目录下建立一个脚本“.bash_profile”, vim .bash_profile 并输 ...

  8. zy 送画

    问题描述 话说在军训的倒数第二天,zy终于下定决心要将画了 10天之久的画像送给他心怡的法学院mm.但是,他不敢自己一个人去,倒霉的 kk 只能和他一起去了.不过,为了表现的有诚意,kk和zy不能走在 ...

  9. html或jsp实现打印三种方法

    1.使用window.print()方法 优点:支持多浏览器 缺点:取消打印,隐藏打印不必要的信息后再显示比较麻烦 如下实现,可以打印当前页面 <input name ="Button ...

  10. 【Android - 进阶】之图片三级缓存的原理及实现

    在Android开发中,如果图片过多,而我们又没有对图片进行有效的缓存,就很容易导致OOM(Out Of Memory)错误.因此,图片的缓存是非常重要的,尤其是对图片非常多的应用.现在很多框架都做了 ...