You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Informix数据库导入数据时如何跳过已存在记录?

Informix导入CSV时跳过已存在记录的解决方法

你遇到的报错是由于目标表的唯一键(pk_column_a)冲突导致LOAD命令中断,默认情况下Informix的LOAD命令遇到约束冲突会停止执行。以下两种方法可以实现跳过重复记录完成导入,无需修改源CSV文件:

方法一:使用LOAD + EXCEPTION子句(保留冲突记录)

通过创建异常表,将违反约束的记录导入到异常表中,主表仅导入无冲突的记录,且导入过程不会中断。

  1. 创建异常表
    异常表需要包含目标表的所有字段,同时添加三个字段存储错误信息:
-- 先复制目标表结构,再添加错误字段
CREATE TABLE ex_target_table LIKE target_table;
ALTER TABLE ex_target_table ADD (
    errnum INT,
    errmsg VARCHAR(255),
    row_num INT
);
  1. 带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过滤已存在的记录。

  1. 创建外部表
    根据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 ";"
);
  1. 过滤重复记录导入
    通过查询外部表,只插入目标表中不存在的记录:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 17:17:40