2011-06-10 61 views
2

我有一行來自第三方的記錄,包括第三方ID。有沒有辦法使用REPLACE命令,它將使用第三方ID而不是我們的內部ID來知道哪些記錄要覆蓋,如果它們已經存在?從第三方MySQL根據主鍵以外的其他名稱替換

例如數據列表:爲出庫

array('name' => 'Bob', 
     'age' => '30', 
     'external_ID' => '540745' 
); 

表結構:

ID int auto_increment primary key, 
name varchar(255), 
age int, 
external_id int 

回答

4

external_id獨特。它會工作:

ALTER TABLE `test` ADD UNIQUE(`external_id`) 
0

我會使用替換爲一個非常大的原因很大程度上避免:IT MECHANICALLY PERFORMS DELETE AND INSERT UNDER THE HOOD

Here is a bug report from 2005-09-26其中MySQL會脫離REPLACE上的UPDATE觸發器而不是DELETE和INSERT觸發器。即使這個bug已經修復,但如果你有2005-09-26之前的MySQL版本,立即升級或者至少不要使用REPLACE !!!!

您是使用得多,而不是INSERT IN DUPLICATE KEY UPDATE

Percona blogs about this 4 months after the bug report was closed and recommends the new feature of INSERT ON DUPLICATE KEY UPDATE.

如果你是剛剛更換EXTERNAL_ID更好,你可能不需要在exteral_id唯一索引。

看,當您使用REPLACE和帶auto_incrment ID表會發生什麼:

REPLACE(內部刪除和插入),將有效地改變與EXTERNAL_ID相關的id字段。如果您追蹤30歲的鮑勃,則在其他表中使用ID爲76和ID爲76的外部ID 540745來引用Bob,執行REPLACE可能會斷開Bob與其他表可能認識他的原始ID的關係。