1. 数据同步
首先,需要说明的是【数据同步】操作只能用在【合并记录】操作之后。前面说过,【合并记录】操作会生成一个新的字段flagfield,其根据数据的来源及变化情况,对每条记录进行标记。具体【合并记录】的用法,可参考https://blog.csdn.net/yeshang_lady/article/details/107924036 。这里仍然使用上述博客中的数据,对【数据同步】的作用进行说明。
创建如下转换,【csv文件输入】、【csv文件输入2】及【合并记录】等的配置信息与上述博客中的相同,不在赘述。
下面对【数据同步】进行配置。先看【一般】选项框,具体如下:
这一部分跟【插入/更新】类似,这里不再赘述。这里需要说明一点,目标表的表结构不需要与数据流(即【合并记录】中的表结构)相同。
下面来看【高级】选项卡。
操作字段名就是【合并记录】步骤生成的标记字段名(操作字段名这里是必填项,如果不填写的话,会报错It was not possible to find operation field [null] in the input stream!)。接下来三个框里只有填“identical”、‘changed’,‘new’,'deleted'时才能发挥作用。下面具体来说;
- 当值相等时插入:在本例中,将数据流中flagfield=new的记录插入到目标表中。
- 当值相等时更新:在本例中,使用数据流中flagfield=changed的记录对目标表中的数据进行更新。这项操作的前提是目标表中存在与flagfield=changed对应的相等记录。判断两个记录是否相等,依据【一般】选项卡中【用来查询的关键字】中设置的判断条件。即使更新,也只会对【一般】选项卡中【更新字段】指定的字段进行更新。
- 当值相等时删除:在本例中,将数据流中flagfield=deleted记录从目标表中删除。
- 执行查询:当执行更新和删除操作时,会比较数据流的每条记录是否已经在目标表中,如果没有出现,则抛出异常。(资料上是这么说的,但是当我只设定当值相等时插入时并勾选执行查询时,也有可能抛出异常)
2. 实验过程
在mysql中创建目标表test_0819,其创建语句如下:
create table `test_0819` (
`id` int (11),
`salesArea` varchar (765),
`brand` varchar (765),
`model` varchar (765),
`unitPrice` int (11),
`number` int (11)
);
当采用如下设置时:
此时test_0819表中的数据如下:
将test_0819表中的数据清空,将1_a.csv文件中的数据传到test_0819表中,具体代码如下:
--csv文件要放到特定的目录下,并把编码方式改成utf-8
truncate table test_0819;
load data infile '1_a.csv' into table test_0819 fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n' ignore 1 lines;
此时,test_0819中的数据如下:
更改【数据同步】的配置如下,并重新运行转换。
运行后,test_0819表中的数据如下:
可以看到,id从1到6的数据被删除,而id为7和8中的数据已经更新了。