在PostgreSQL中插入唯一值

时间:2015-10-13 16:04:29

标签: sql postgresql insert distinct

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

MyDocumentListApiView

但是,我仍然收到错误: psycopg2.IntegrityError:重复键值违反了唯一约束“users_key”

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

谢谢!

2 个答案:

答案 0 :(得分:3)

您似乎正在尝试执行insert ... if not exists类型的操作。如果您使用PostgreSQL 9.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 ...的{​​{1}}部分返回零行。

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

答案 1 :(得分:0)

对于正在寻找将一个表中的唯一值插入到没有唯一键的表中的方法的任何人(换句话说,只插入其中整列列与一组列不匹配的行)目标表中的现有记录)

e.g。

表1

    column1  column2
    -------  -------
 1.  dog     collar

表2

    column1  column2
    -------  -------
 1. dog      collar 
 2. dog      leash  

预期效果是从表2中插入第2列,但不插入第1列,因为它与表1中的行匹配。

这对我有用,虽然性能不高:

INSERT INTO table1 (
    column1,
    column2
    ) 

    SELECT 
    column1,
    column2

    FROM table2 

    WHERE ( 
    column1,
    column2
    ) 

    NOT IN 

    (SELECT     
    column1,
    column2
    FROM table1)