在PostgreSQL中插入唯一值

人气:1,008 发布:2022-10-16 标签: sql postgresql insert distinct

问题描述

我正在尝试在我的数据库中插入不同的值: 我的查询是这样的:

    query2 = "INSERT INTO users (id, name, screenName, createdAt, defaultProfile, defaultProfileImage,
    description) SELECT DISTINCT %s, %s, %s, %s, %s, %s, %s;"

    cur.execute(query2, (user_id, user_name, user_screenname, user_createdat, 
    default_profile, default_profile_image, description))

但是,我仍然收到错误:opCopg2.IntegrityError:重复的键值违反唯一约束"USERS_KEY"。

我猜查询将插入所有数据,然后选择不同的值? 我想另一种方法是将所有数据存储在一个临时数据库中,然后在那里检索它们。 但有没有更简单的方法呢?

谢谢!

推荐答案

您似乎正在尝试执行insert ... if not exists类型的操作。如果你使用的是PostgreSQL9.5,你应该使用INSERT ... ON CONFLICT NO ACTION。相关详情请参见How to UPSERT (MERGE, INSERT ... ON DUPLICATE UPDATE) in PostgreSQL?

SELECT DISTINCT,您使用它的方式对您没有帮助。它只对SELECT语句输入的行进行操作。它不知道输出行的去向,在您的情况下是到表。

您需要联接该表,或者使用WHERE NOT EXISTS (SELECT 1 FROM mytable WHERE ...)使INSERT INTO ... SELECT ...SELECT部分返回零行(如果该行已存在于目标表中)。

请注意,这仍然受竞争条件的影响。如果您有多个并发客户端,则还需要LOCK表。

762