测试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 注意事项 ...
随机推荐
- vim下如何删除某行之后的所有行
使用dG进行删除 在命令模式下将光标置于要删除的起始行,然后依次输入d,G
- Android JSON数据解析(数据传输)
上篇随笔详细介绍了三种解析服务器端传过来的xml数据格式,而对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三 种格式,那么本篇随笔将讲解一下json这个知识点,包括如何通 ...
- 【CF】270D Design Tutorial: Inverse the Problem
题意异常的简单.就是给定一个邻接矩阵,让你判定是否为树.算法1:O(n^3).思路就是找到树边,原理是LCA.判断树边的数目是否为n-1.39-th个数据T了,自己测试2000跑到4s.算法2:O(n ...
- %3A%2F%2F这样的叫什么码啊?
%3A -> 3A -> 16*3+10 -> 58 -> chr(58) = ":"%2F -> 2F -> 16*2+15 -> 47 ...
- Spark(Hive) SQL数据类型使用详解(Python)
Spark SQL使用时需要有若干“表”的存在,这些“表”可以来自于Hive,也可以来自“临时表”.如果“表”来自于Hive,它的模式(列名.列类型等)在创建时已经确定,一般情况下我们直接通过Spar ...
- Web Service和ISAPI的区别与联系 转
Web Service和ISAPI的区别与联系 1.Web Service 是一种新的web应用程序分支,他们是自包含.自描述.模块化的应用,可以发布.定位.通过web调用.Web Service ...
- 有关DOM的小总结
一直以为DOM(文档对象模型)是JS中最简单的一部分.不可否认,它确实很简单,因为DOM的思维模式有点固定,只需要简单地记住一些固定的方法,所以DOM可以说是所有js(这里指的是客户端的js)入门的起 ...
- c++学习笔记(2)类的声名与实现的分离及内联函数
一.类的声名与实现的分离: 和c函数声明与实现分离类似 有.h : 类的声明 .cpp : 类的实现 在在一个类的cpp中应该包含本类的.h文件 在cpp中类的使用:例: //Circle类 //Ci ...
- NDK的安装和下载
从官网下载NDK 下载页面:https://developer.android.com/ndk/downloads/index.html 从镜像站点下载NDK "大师兄"是一个由腾 ...
- UILabel的使用方法
UILabel 就是一个显示文字的控件,可以设置文字的各种属性. 构造方法: //通过设置Label的边框来初始化UILabel labelOfSlider = [[UILabelal ...