导入CSV至PostgreSQL表时遇唯一约束重复键值错误求助
解决PostgreSQL导入CSV时的唯一约束重复错误
首先咱们得把问题根源说透:你创建表的时候,错误地给很多本不该唯一的字段加上了UNIQUE约束——比如production_companies、genres、production_countries这些。但真实的电影数据里,这些字段本来就会有大量重复:比如很多电影都是美国公司制作的,同一类型的电影更是一抓一大把,所以导入CSV时,PostgreSQL检测到重复值就直接触发报错了。
具体解决步骤
先删除错误的表(如果表还没存重要数据的话):
DROP TABLE IF EXISTS tmdb_5000_movies;重新创建符合逻辑的表结构:
只有id字段是电影的唯一标识,适合设为PRIMARY KEY(自带唯一约束),其他字段完全不需要UNIQUE限制。修改后的建表语句如下:CREATE TABLE tmdb_5000_movies ( "budget" INT, "genres" VARCHAR, "homepage" VARCHAR, "id" INT PRIMARY KEY, -- 电影ID是唯一标识,设为主键即可 "keywords" VARCHAR, "original_language" VARCHAR, "original_title" VARCHAR, "overview" VARCHAR, "popularity" DEC, "production_companies" VARCHAR, "production_countries" VARCHAR, "release_date" DATE, "revenue" BIGINT, "runtime" INT, "spoken_languages" VARCHAR, "status" VARCHAR, "tagline" VARCHAR, "title" VARCHAR, "vote_average" DEC, "vote_count" INT );重新导入CSV文件:
这时候再执行导入操作,应该就不会再出现duplicate key value violates unique constraint的错误了。
给新手的额外优化建议
你会发现genres、production_companies这些字段存的是类JSON字符串,如果后续需要查询这些字段里的具体内容(比如找所有动作片),可以把这些字段的类型改成JSONB,操作会更灵活。修改后的字段定义如下:
"genres" JSONB, "keywords" JSONB, "production_companies" JSONB, "production_countries" JSONB, "spoken_languages" JSONB
比如要查询所有动作类型的电影,就可以用这样的SQL:
SELECT * FROM tmdb_5000_movies WHERE genres @> '[{"name": "Action"}]';
内容的提问来源于stack exchange,提问作者Lsalazar
相关产品推荐
相关产品推荐

