Informix数据库导入数据时如何跳过已存在记录?
Informix导入CSV时跳过已存在记录的解决方法
你遇到的报错是由于目标表的唯一键(pk_column_a)冲突导致LOAD命令中断,默认情况下Informix的LOAD命令遇到约束冲突会停止执行。以下两种方法可以实现跳过重复记录完成导入,无需修改源CSV文件:
方法一:使用LOAD + EXCEPTION子句(保留冲突记录)
通过创建异常表,将违反约束的记录导入到异常表中,主表仅导入无冲突的记录,且导入过程不会中断。
- 创建异常表
异常表需要包含目标表的所有字段,同时添加三个字段存储错误信息:
-- 先复制目标表结构,再添加错误字段 CREATE TABLE ex_target_table LIKE target_table; ALTER TABLE ex_target_table ADD ( errnum INT, errmsg VARCHAR(255), row_num INT );
- 带EXCEPTION的LOAD命令
修改原LOAD语句,指定异常表:
LOAD FROM /myfolder/example_file.csv DELIMITER ";" INSERT INTO target_table EXCEPTION INTO ex_target_table ;
执行后,无冲突的记录会导入target_table,违反唯一约束的记录会存入ex_target_table,可后续查询异常表处理冲突数据。
方法二:使用外部表 + INSERT SELECT(直接过滤重复)
通过外部表将CSV文件映射为数据库表,再用INSERT ... SELECT结合NOT EXISTS过滤已存在的记录。
- 创建外部表
根据CSV结构创建外部表(字段需与目标表一致):
CREATE EXTERNAL TABLE ext_example_table ( -- 按目标表字段定义填写,示例如下 column_a INT, column_b VARCHAR(50), column_c DATE ) USING ( DATAFILES ("DISK:/myfolder/example_file.csv"), DELIMITER ";" );
- 过滤重复记录导入
通过查询外部表,只插入目标表中不存在的记录:
INSERT INTO target_table SELECT * FROM ext_example_table WHERE NOT EXISTS ( SELECT 1 FROM target_table t WHERE t.column_a = ext_example_table.column_a -- 匹配唯一键字段 );
这种方式会直接跳过所有已存在的记录,不会产生冲突报错,也无需保留冲突数据。
附:原操作相关信息
报错信息
268: Unique constraint (informix.pk_column_a) violated. 100: ISAM error: duplicate value for a record with unique key.
847: Error in load file row 1.
原UNLOAD导出命令
UNLOAD TO /myfolder/example_file.csv DELIMITER ";" SELECT * FROM example_table ;
原LOAD导入命令
LOAD FROM /myfolder/example_file.csv DELIMITER ";" INSERT INTO target_table ;
内容的提问来源于stack exchange,提问作者Mi2830
相关产品推荐
相关产品推荐

