Windows下Docker部署Vertica使用COPY命令出现主键重复录入问题
Vertica COPY加载出现主键重复问题解答
根本原因
Vertica作为面向分析场景的列式数据库,为了保障批量数据加载的性能,对主键、唯一键这类约束的默认处理逻辑为仅启用以供查询优化器使用,不会在数据写入时强制校验:
- 单条
INSERT/UPDATE语句默认会触发约束校验,因此你最开始单条插入数据时不会出现主键重复问题 COPY批量加载命令默认走高性能写入路径,仅校验数据格式、类型不匹配这类基础错误,不会主动校验主键重复,该逻辑和你是否加rejected data参数无关,rejected data仅负责收集基础格式/类型错误的记录,不会处理主键冲突这类业务约束错误。
重复数据产生的逻辑
- 第三次带
rejected data导入student_bad.csv时,student_id=6是首次写入不存在冲突,仅第一行类型错误的记录被打入拒绝表,此时表内仅有1条student_id=6的记录 - 第四次再次导入同一份文件时,
student_id=6的记录已存在,但COPY默认不做主键校验,因此直接写入成功,最终出现两条主键相同的记录。
注:你第二步执行的COPY命令中表名写为
testschema.students(多了后缀s)属于笔误,实际表名为student,不影响本次问题的核心逻辑。
解决方案
如果需要在COPY加载时强制校验主键约束,可以在COPY命令中添加ENFORCE_CONSTRAINTS参数,示例:
COPY testschema.student FROM '/home/dbadmin/vertica_test/student_bad.csv' DELIMITER ',' ENFORCE_CONSTRAINTS REJECTED DATA AS TABLE students_rejected;
如果是大数据量批量加载,不建议开启加载时约束校验(会大幅降低加载性能),推荐在加载完成后调用内置函数校验约束,手动清理重复数据:
-- 检查指定表的所有约束冲突 SELECT ANALYZE_CONSTRAINTS('testschema.student');
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

