我以前從未見過SQL中使用過的語法INSERT OR REPLACE INTO names (id, name) VALUES (1, "John")
,我想知道爲什麼它比UPDATE names SET name = "John" WHERE id = 1
更好。有沒有什麼好的理由使用其中一個。這個語法是特定於SQLite的嗎?SQLite「INSERT或REPLACE INTO」與「UPDATE ... WHERE」
46
A
回答
76
如果該行不存在,UPDATE將不會執行任何操作。
INSERT OR REPLACE將在插入行不存在的情況下插入,或者如果存在,則替換值。
4
如果id = 1不存在,插入或替換查詢會插入新記錄。
更新查詢只會在id = 1時響起,如果它不存在,它不會創建新記錄。
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'
此方法允許替換,而不會引起觸發發生。
相關問題
- 1. SqLite3 - INSERT或REPLACE INTO where id = ...?
- 2. Android SQLite INSERT或REPLACE
- 3. INSERT INTO SELECT UPDATE
- 4. 未使用REPLACE INTO或ON DUPLICATE KEY UPDATE
- 5. INSERT INTO與WHERE IN子句
- 6. 使用INSERT INTO與WHERE
- 7. INSERT INTO using WHERE
- 8. REPLACE INTO ... ON DUPLICATE KEY UPDATE
- 9. SQLite語法REPLACE + WHERE
- 10. SELECT FOR UPDATE WITH INSERT INTO
- 11. 轉換INSERT INTO到UPDATE
- 12. REPLACE INTO sqlite不會取代
- 13. SQLite語句INSERT OR REPLACE INTO not clear to me
- 14. SQLite「INSERT OR REPLACE INTO」無法正常工作
- 15. MySQL的直接INSERT INTO與WHERE子句
- 16. INSERT INTO與SELECT
- 17. N'INSERT INTO與INSERT INTO
- 18. SQLite INSERT OR REPLACE查詢
- 19. INSERT INTO使用CASE - sqlite?
- 20. INSERT INTO SELECT WHERE col = col
- 21. sql insert into,select,where語句
- 22. INSERT INTO table1 values FROM table2 WHERE
- 23. MySQL INSERT INTO WHERE NOT EXIST
- 24. SQL UPDATE或INSERT
- 25. SQLITE - INSERT或UPDATE不改變ROWID值
- 26. SQLite,SQL:相應地使用UPDATE或INSERT
- 27. INSERT INTO ... ON DUPLICATE KEY UPDATE增量語法
- 28. SQLite的INSERT INTO失敗
- 29. SQLite的:INSERT INTO標識列
- 30. INSERT INTO與DB
感謝您的回答。這是一個SQLite的具體事情? – 2010-02-13 10:11:12
雖然Sql Server現在有一個MERGE命令,但我不是這個inSql服務器的代碼。而rom MS Access我也沒有見過這樣的事情。 – 2010-02-13 10:14:02
mysql已經「替換成」了。 – fastmultiplication 2011-08-11 05:50:25