PostgreSQL: ERROR: duplicate key value violates unique constraint
PostgreSQL: ERROR: duplicate key value violates unique constraint
我有一个 table 结构如下:
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)
);
当我 运行 执行以下命令时,它在第一次尝试时成功执行,但我没有看到任何新数据插入 table。
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
为什么我在 table 中看不到任何数据?
这是因为在索引中使用了“文本”类型。使用没有任何限制的 SQL 类型,如 text 是非常愚蠢的,尽管事实上甚至 PG 的东西都推荐它。这会导致您面临的一些灾难性情况!
切勿使用“文本”类型。将 CHAR 或 VARCHAR 与维度一起使用(例如 VARCHAR(256))。
索引有一些限制,例如字节数...(2700 以上),但由于非常愚蠢的自动截断,约束错误将覆盖问题的真正原因...
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'$$
或类似。
我有一个 table 结构如下:
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)
);
当我 运行 执行以下命令时,它在第一次尝试时成功执行,但我没有看到任何新数据插入 table。
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
为什么我在 table 中看不到任何数据?
这是因为在索引中使用了“文本”类型。使用没有任何限制的 SQL 类型,如 text 是非常愚蠢的,尽管事实上甚至 PG 的东西都推荐它。这会导致您面临的一些灾难性情况!
切勿使用“文本”类型。将 CHAR 或 VARCHAR 与维度一起使用(例如 VARCHAR(256))。
索引有一些限制,例如字节数...(2700 以上),但由于非常愚蠢的自动截断,约束错误将覆盖问题的真正原因...
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'$$
或类似。