问题描述
我正在尝试在我的数据库中插入不同的值: 我的查询是这样的: 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
表。