测试Kettle在增量更新的时候是否支持级联——不支持(基于mysql)
由于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)的更多相关文章
- kettle教程---增量更新
以下操作都在5.0.1版本下进行开发,其余版本可以进行自动比对 在平时工作当中,会遇到这种情况,而且很常见.比如:增量抽取(每隔2个小时抽取截至到上次抽取时间的记录) 一.操作前提: 存在3张表,源表 ...
- Kettle中通过触发器方式实现数据 增量更新
在使用Kettle进行数据同步的时候, 共有 1.使用时间戳进行数据增量更新 2.使用数据库日志进行数据增量更新 3.使用触发器+快照表 进行数据增量更新 今天要介绍的是第3中方法. 实验的思路是这样 ...
- kettle教程---通过配置表格配置实现数据的批量增量更新(实用)
本文接上篇文章,上面文章讲的是,通过配置文件的全量更新,现在说下增量更新 如上图所示,涉及到1个转换和1个作业. 1-表增量同步(转换) 可以通过读取同步表参数这个excel表格文件,获取表名称和同步 ...
- SSIS Design2:增量更新
一般来说,ETL实现增量更新的方式有两种,第一种:记录字段的最大值,如果数据源中存在持续增加的数据列,记录上次处理的数据集中,该列的最大值:第二种是,保存HashValue,快速检查所有数据,发现异动 ...
- [转载]BW增量更新的理解(时间戳)
在BW中,存在两种数据抽取方式,完全更新与增量更新,完全更新是每次把截至到某个时间的数据全部抽取,增量抽取则只抽取上次和本次抽取之间更新的数据,很显然,增量抽取能够提高系统效率,根据SAP帮 助的说法 ...
- 增量更新项目时的备份MyBak
在增量更新项目时,做好备份十分重要,这里提供一个方法备份java Web所更新的文件. 把更新包放在指定目录,配好如下webappFolder.updateFolder以及bakeupFolder的路 ...
- SSIS 实例 从Ftp获取多个文件并对数据库进行增量更新。
整个流程 Step 1 放置一个FTP Task 将远程文件复制到本地 建立FTP链接管理器后 Is LocalPatchVariable 设置为Ture 并创建一个变量设置本地路径 Operatio ...
- [译]Stairway to Integration Services Level 4 - 增量更新数据
在本文中, 我们说下增量更新数据:即将数据源中更新了的数据替换掉目标表中对应的数据. 更新代码 操作之前我们先把目标表e (dbo.Contact). 的数据改掉 Use AdventureWorks ...
- Android 增量更新实例(Smart App Updates)
原地址:http://my.oschina.net/liucundong/blog/160436 官方说明 实现原理 实现 (1)生成差异包 (2)使用旧apk+差异包,在客户端合成新apk 注意事项 ...
随机推荐
- h.264并行解码算法2D-Wave实现(基于多核共享内存系统)
cache-coherent shared-memory system 我们最平常使用的很多x86.arm芯片都属于多核共享内存系统,这种系统表现为多个核心能直接对同一内存进行读写访问.尽管内存的存取 ...
- lc面试准备:Invert Binary Tree
1 题目 Invert a binary tree. 4 / \ 2 7 / \ / \ 1 3 6 9 to 4 / \ 7 2 / \ / \ 9 6 3 1 接口: public TreeNod ...
- 《Effective C++》条款14 总是让base class拥有virtual destructor
有时,一个类想跟踪它有多少个对象存在.一个简单的方法是创建一个静态类成员来统计对象的个数.这个成员被初始化为0,在构造函数里加1,析构函数里减1.(条款m26里说明了如何把这种方法封装起来以便很容易地 ...
- Bluetooth LE(低功耗蓝牙) - 第五部分
回顾: 在本系列前面的文章中我们完成了发现BLE传感器并与之建立连接.现在只剩下从其中获取数据了,但是这并没有看起来那么简单.在这篇文章中我们将讨论GATT的特点以及如何促进主机与传感器之间的数据交换 ...
- 从 mian 函数开始一步一步分析 nginx 执行流程(四)
如不做特殊说明,本博客所使用的 nginx 源码版本是 1.0.14,[] 中是代码所在的文件! 这一节我们分析ngx_worker_process_cycle(),该函数代码比较少,因为它通过调用函 ...
- Java Web中web.xml的作用
每一个javaWeb工程都有一个web.xml配置文件,那么他到底有什么作用呢?它是每一个web工程都必的必须的吗? web.xml文件是用来初始化工程配置信息的,比如说welcome页面,fil ...
- checkbox操作
小小示例:自己备份顺便粘出来共享. 引入头部文件:<script src="../js/jQuery1.7.2.js"></script> HTML代码: ...
- z
360导航_新一代安全上网导航 http://www.codeproject.com/Articles/636730/Distributed-caching-using-Redis-server-wi ...
- ios策略模式应用
策略模式应用大量应用于解决巨型switch-case if-else..... 具体使用方法 : 策略基类(BaseStrategy)包含一个虚算法,所有子类实现虚算法 容器类含有一个指向策略基类的 ...
- C# ToString格式大全
C# 货币 2.5.ToString("C"); // ¥2.50 // D 10进制数 25.ToString("D5"); // 25000 // E ...