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

PostgreSQL如何在UNIQUE字段插入数据时自动忽略重复值?

PostgreSQL插入时自动忽略唯一约束重复行实现方法

场景说明

现有带唯一约束字段的数据表,结构如下:

CREATE TABLE my_table 
(
    my_column varchar(10) UNIQUE
);

直接执行包含重复值的插入语句时,PostgreSQL会抛出唯一约束冲突错误。需要实现插入时自动跳过重复行,不报错,最终表中只保留非重复数据。
例如执行插入:

INSERT INTO my_table (my_column) 
VALUES ('cat'), ('dog'), ('cat') ;

期望最终表中仅存在cat、dog两条记录。

推荐方案(PostgreSQL 9.5及以上版本)

使用PostgreSQL原生支持的ON CONFLICT子句,指定冲突时不执行任何操作即可,这是性能最好、并发安全的实现方式,写法如下:

INSERT INTO my_table (my_column) 
VALUES ('cat'), ('dog'), ('cat')
ON CONFLICT (my_column) DO NOTHING;

语法解释

  • ON CONFLICT (my_column):声明监听my_column字段的唯一约束冲突,括号内填写建立了唯一约束的字段名即可,如果是多字段联合唯一约束,就把所有约束字段填在括号内
  • DO NOTHING:触发冲突时直接跳过当前重复的待插入行,不做修改、不抛出错误
    执行上述语句后,第二条重复的cat记录会被自动忽略,表中只会插入首次出现的cat和dog,完全符合预期。

兼容旧版本方案(9.5以下版本,不推荐)

如果使用的是早已停止维护的9.5以下老旧版本,可以通过NOT EXISTS子句过滤已存在值实现类似效果:

INSERT INTO my_table (my_column)
SELECT tmp.value
FROM (VALUES ('cat'), ('dog'), ('cat')) AS tmp(value)
WHERE NOT EXISTS (
    SELECT 1 FROM my_table WHERE my_column = tmp.value
);

注意:该写法在高并发插入场景下仍有概率触发唯一约束错误,无特殊兼容需求请优先使用ON CONFLICT方案。


内容的提问来源于stack exchange,提问作者Gurom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 20:15:44