2015-10-13 28 views
0
插入唯一值

我想在我的數據庫中插入不同值: 我的查詢是這樣的:PostgreSQL中

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)) 

但是,我仍然得到錯誤:psycopg2.IntegrityError:重複鍵值違反了唯一的約束「users_key」

我想查詢插入所有數據,然後選擇不同的值? 另一種方法我猜是將所有數據存儲在臨時數據庫中,然後在那裏檢索它們。 但是有沒有更簡單的方法?

謝謝!

+1

'SELECT DISTINCT' ...從哪裏? –

+0

@Matteo'distinct'不需要'from',雖然在這種情況下它是多餘的 –

+0

_I我猜你猜...你插入一個已經存在的密鑰。 –

回答

2

您似乎在嘗試執行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 ...SELECT部分返回零行。

但請注意,這仍然受到競爭條件的限制。如果您有多個併發客戶端,則還需要LOCK表。

0

對於任何正在尋找將唯一值從一個表插入到沒有唯一鍵的表中的換句話說,只插入其中全部列不匹配一組列的行目標表中的現有記錄)

例如

表1

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

表2

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

預期效果是從表2中,但沒有第1列插入第2列,因爲它在表匹配的行1.

這工作對我來說,雖然不是非常高性能:

INSERT INTO table1 (
    column1, 
    column2 
    ) 

    SELECT 
    column1, 
    column2 

    FROM table2 

    WHERE ( 
    column1, 
    column2 
    ) 

    NOT IN 

    (SELECT  
    column1, 
    column2 
    FROM table1)