MySQL謹慎使用"replace into"

轉自:http://www.t086.com/article/5074

MySQL 對 SQL 有很多擴展,有些用起來很方便,但有一些被誤用之後會有性能問題,還會有一些意料之外的副作用,比如 REPLACE INTO。

具體例子參考http://www.t086.com/article/5074;

結論:MySQL 在執行 REPLACE INTO auto (k) VALUES (1) 時首先嚐試 INSERT INTO auto (k) VALUES (1),但由於已經存在一條 k=1 的記錄,發生了 duplicate key error,於是 MySQL 會先刪除已有的那條 k=1 即 id=1 的記錄,然後重新寫入一條新的記錄。由於新寫入記錄時並未給 extra 字段指定值,原記錄 extra 字段的值就「丟失」了,而通常這並非是業務上所預期的,更常見的需求實際上是,當存在 k=1 的記錄時,就把 v 字段的值更新爲 ‘1-1’,其他未指定的字段則保持原狀,而滿足這一需求的 MySQL 方言是

INSERT INTO auto (k, v) VALUES (1, ‘1-1’) ON DUPLICATE KEY UPDATE v=VALUES(v);

鑑於此,很多使用 REPLACE INTO 的場景,實際上需要的是 INSERT INTO … ON DUPLICATE KEY UPDATE,在正確理解 REPLACE INTO 行爲和副作用的前提下,謹慎使用 REPLACE INTO。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章