2010-02-12 261 views

回答

76

如果該行不存在,UPDATE將不會執行任何操作。

INSERT OR REPLACE將在插入行不存在的情況下插入,或者如果存在,則替換值。

+0

感謝您的回答。這是一個SQLite的具體事情? – 2010-02-13 10:11:12

+0

雖然Sql Server現在有一個MERGE命令,但我不是這個inSql服務器的代碼。而rom MS Access我也沒有見過這樣的事情。 – 2010-02-13 10:14:02

+0

mysql已經「替換成」了。 – fastmultiplication 2011-08-11 05:50:25

4

如果id = 1不存在,插入或替換查詢會插入新記錄。

更新查詢只會在id = 1時響起,如果它不存在,它不會創建新記錄。

+2

我不認爲這是正確的。 sqlite文檔(截至2010年7月1日,版本3.6.23.1)說'REPLACE是INSERT OR REPLACE'的別名,因此會有相同的行爲。根據我的經驗,這是這種情況.. – fostandy 2010-06-30 16:36:21

+0

我認爲如果發現衝突,它會執行delete-> insert – StErMi 2012-01-06 18:06:22

+1

@fostandy REPLACE確實是INSERT OR REPLACE的別名,但您要評論的答案正在討論更新(因爲這就是問題所在)。 – hatfinch 2012-02-02 22:27:42

29

我目前正在處理這樣的聲明,並計算出另一個需要注意的事實: INSERT OR REPLACE將替換聲明中未提供的任何值。例如,如果您的表包含您未提供值的列「lastname」,那麼INSERT OR REPLACE將盡可能地取消「lastname」(約束條件允許)或失敗。

+7

+1;換句話說:總是指定_complete值的集合_「更新」行應該有 - 沒有現有值被保留;這種行爲的原因實際上不是現有行的* update *操作,而是刪除操作,然後是重新插入操作。 – mklement0 2014-05-16 20:39:50

5
REPLACE INTO table(column_list) VALUES(value_list); 

INSERT OR REPLACE INTO table(column_list) VALUES(value_list); 

對於較短的形式替換以正確執行,你的表結構必須具有唯一行,無論是簡單的主鍵或唯一索引。

REPLACE刪除,然後INSERT該記錄,並會導致一個INSERT觸發器執行,如果你有他們安裝。如果您在INSERT上有觸發器,則可能會遇到問題。


這是一個變通..不檢查速度..

INSERT OR IGNORE INTO table (column_list) VALUES(value_list); 

隨後

UPDATE table SET field=value,field2=value WHERE uniqueid='uniquevalue' 

此方法允許替換,而不會引起觸發發生。