时间:2021-07-01 10:21:17 帮助过:9人阅读
由于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/ target=_blank class=infotextkey>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/ target=_blank class=infotextkey>photoshop_changed'),(2792,'flash'),(1632,'computer'),
(3216,'history'),(480604, 'operating system_new');
//(12402,'new class'),(480604, 'operating system_new')=>对应的是new
//(1961,'photoshop/ target=_blank class=infotextkey>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却被成功的同步进去了。
这一点与设想的一致。
接下来还是,乖乖的使用快照方式以及触发器来实现同步数据吧~
虽说这次试验思路真的是挺简单的,
但是操作起来还是不顺手,有很多方法思想也不主流。
希望以后对这门技术更加的精通,呵呵。
还有很多东西要学习呢,加油吧~
bitsCN.com