测试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 注意事项 ...
随机推荐
- Android 使用HttpClient方式提交POST请求
final String username = usernameEditText.getText().toString().trim(); final String password = passwr ...
- mysql主从配置(清晰的思路)
mysql主从配置.鄙人是在如下环境测试的: 主数据库所在的操作系统:win7 主数据库的版本:5.0 主数据库的ip地址:192.168.1.111 从数据库所在的操作系统:linux 从数据的版本 ...
- 解决VS2005 VS2008 vs2010断点无效-源代码与原始版本不同
网上说的方法:(额~但是我就是不能用.但是也贴出来) 方法1.直接把整个文件格式化了一次,断点就可以用了Ctrl + A全选菜单:编辑-〉高级-〉设置选定内容的格式 (Ctrl+K, Ctrl+F)通 ...
- 【HDOJ】1728 逃离迷宫
题目大坑,注意行列顺序式反的,另外注意起点和终点相同. #include <iostream> #include <cstdio> #include <cstring&g ...
- 关于下拉刷新你是否真的非常理解还是只会搬砖?附 Android 实例子源代码文件下载地址380个合集
1,推荐几篇非常有用的博文 原创写的真的非常好 主要讲解原理,整体布局三部分组成以及设置padding等等作用, 下拉的具体实现 滑动到底部具体加载以及判断手势事件,再次推荐作者的 详细讲解 建议先看 ...
- eclipse常见错误
1.The superclass “javax.servlet.http.httpservlet” is not found in the build path 原因:未添加server librar ...
- Selenium API(C#)
1 Fetching a Page driver.Url = "http://www.google.com"; 2 Locating UI Elements (WebElement ...
- Android学习笔记(四)深入探讨Activity
在应用程序中至少包含一个用来处理应用程序的主UI功能的主界面屏幕.这个主界面一般由多个Fragment组成,并由一组次要Activity支持.要在屏幕之间切换,就必须要启动一个新的Activity.一 ...
- BZOJ 3262 陌上花开 CDQ分治
= =原来复杂度还是nlog^2(n) Orz 被喷了 #include<cstdio> #include<cstdlib> #include<algorithm> ...
- 解决wix生成的msi的license对话框空白的问题
今天用Wix做之前写的那个Windows Live Writer的Markdown插件的msi安装包,在wxs文件中用如下的代码添加license文件,结果发现生成msi后license文件框一直是空 ...