2016-01-22 83 views
0

想象一下,一個表是這樣的:插入或更新條目,但未能對違反唯一約束

+-----+-------+ 
| id | value | 
+-----+-------+ 
| id1 | val1 | 
| id2 | val2 | 
+-----+-------+ 

idPRIMARY KEYvalueUNIQUE約束。

我想要做的是使用查詢插入或更新基於其主鍵,但失敗,如果違反唯一約束條目。

作爲一個例子,如果我嘗試插入id1, val2,我希望查詢失敗,而插入id1, val3應更新第一行。

然而,我在sqlite3中觀察到的是,如果我使用INSERT OR REPLACE來插入id1, val2它將取代兩個現有的條目。我也看了一下sqlite的ON CONFLICT子句,但似乎沒有辦法區分UNIQUEPRIMARY KEY約束違規。

有沒有辦法用sqlite做這樣的事情,或者有另一種方式來處理這種情況?

回答

0

OR REPLACE子句使用任何唯一約束,包括主鍵約束,檢測衝突。

如果內置的行爲是不是你想要的,你必須做你自己:

c.execute("UPDATE MyTable SET val = ? WHERE id = ?;", [newValue, id]) 
if c.rowcount == 0: 
    c.execute("INSERT INTO MyTable(val, id) VALUES (?, ?);", [newValue, id]) 
+0

這似乎是可能的內置行爲。訣竅是用相應的衝突解決類似於'value VARCHAR(32)UNIQUE ON CONFLICT FAIL,PRIMARY KEY(Id)ON CONFLICT REPLACE'這樣的_create_表,然後使用'INSERT'命令。 –

相關問題