首页 > 解决方案 > PostgreSQL:错误:重复键值违反唯一约束

问题描述

我有一个具有以下结构的表:

CREATE TABLE admin.file_status
(
    feed_id bigint,
    run_id text COLLATE pg_catalog."default",
    extracted_date text COLLATE pg_catalog."default",
    file_name text COLLATE pg_catalog."default",
    start_time timestamp without time zone,
    end_time timestamp without time zone,
    file_size bigint,
    job_type text COLLATE pg_catalog."default",
    status text COLLATE pg_catalog."default",
    crypt_flag character(1) COLLATE pg_catalog."default",
    destination_path text COLLATE pg_catalog."default",
    header_file character(1) COLLATE pg_catalog."default",
    merge_status text COLLATE pg_catalog."default",
    compression_status text COLLATE pg_catalog."default",
    file_split_status text COLLATE pg_catalog."default",
    data_transfer_status text COLLATE pg_catalog."default",
    CONSTRAINT file_status_ukeyUNIQUE (run_id, file_name)
);

当我运行以下命令时,它在第一次尝试时成功执行,但我没有看到任何新数据插入到表中。

env 'PGOPTIONS=-c search_path=admin -c client_min_messages=error' psql -h hostname -U user -p 25011 -d xplatform -c "\copy admin.file_status(feed_id,run_id,extracted_date,file_name,start_time,file_size,file_split_status) FROM '../temp/213/split_file_list.csv' delimiter ',' csv;commit;"

当我第二次运行它时,出现以下错误:

ERROR:  duplicate key value violates unique constraint "file_status_ukey"
DETAIL:  Key (run_id, file_name)=(1622722357003791, '20210420125933_NOTIFICATION_1_1.txt') already exists.
CONTEXT:  COPY juniper_extd_file_status, line 1

为什么我在表格中看不到任何数据?

标签: postgresqlpsql

解决方案


PostgreSQL 不会在该错误消息中的值周围加上引号。因此,您看到的引号是插入的文字值的一部分。

因此,要查看存在冲突的现有行,您需要执行以下操作:

SELECT * FROM admin.file_status where file_name='''20210420125933_NOTIFICATION_1_1.txt'''

或者

SELECT * FROM admin.file_status where file_name=$$'20210420125933_NOTIFICATION_1_1.txt'$$

或类似的。


推荐阅读