编写SQL Loader控制文件:加载column_type=1数据且不影响column_type=2记录
解决SQL Loader加载时保留column_type=2记录的方案
要实现加载文件数据(column_type=1)时不影响column_type=2的记录,同时替换原有column_type=1的内容,你可以通过加载前删除旧的column_type=1记录+APPEND加载新数据的方式实现,具体控制文件写法如下:
控制文件示例
OPTIONS (SKIP=0) LOAD DATA INFILE '你的数据文件路径' -- 加载前清空表中所有column_type=1的记录,不触动column_type=2的数据 BEFORE LOAD DELETE FROM 你的表名 WHERE column_type = 1; -- 用APPEND模式追加新的column_type=1数据 APPEND INTO TABLE 你的表名 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' -- 根据你的文件分隔符调整 TRAILING NULLCOLS ( 列1, 列2, -- 其他业务列... -- 强制设置column_type为1,避免文件中值错误导致数据混淆 column_type CONSTANT 1 )
方案说明
- BEFORE LOAD子句:在SQL Loader开始加载前执行DELETE语句,仅清除表中
column_type=1的旧记录,完全保留column_type=2的计算生成数据。 - APPEND模式:将文件中的新数据追加到表中,配合前面的DELETE操作,相当于完全替换了
column_type=1的数据集,同时不会影响类型2的记录。 - CONSTANT 1:强制给加载的每条记录设置
column_type=1,避免文件中存在错误值导致数据类型混淆。
为什么之前的选项不适用?
- REPLACE:会清空整张表,显然不符合保留类型2数据的需求;
- APPEND单独使用:会保留旧的
column_type=1记录,导致新旧数据共存; - UPDATE:只能更新表中已存在匹配条件的记录,无法处理文件中新增的
column_type=1数据,也无法删除文件中不存在的旧类型1记录。
如果你的场景需要保留部分旧的column_type=1记录(比如只更新匹配主键的行,新增不匹配的行),可以考虑结合外部表+MERGE语句,但如果是要完全替换类型1的数据,上面的控制文件方案最直接有效。
内容的提问来源于stack exchange,提问作者Gisele
相关产品推荐
相关产品推荐

