2011-05-11 92 views
2

在寫我的問題(HOWTO:插入一個新的條目,如果它已經存在,更新它),我發現在Related Questions一些答案:DBD :: SQLite的:插入或更新 - 問題

$sql = "INSERT OR REPLACE INTO $table (Id, Name, Rating) VALUES(?, ?, ?)"; 
$sth_rating = $dbh->prepare($sql); 
$sth_rating->execute($id, $name, $rating); 

$sql = "INSERT OR IGNORE INTO $table (Id, Name, Rating) VALUES (?, ?, ?)"; 
$sth_rating = $dbh->prepare($sql); 
$sth_rating->execute($id, $name, $rating); 

$sql = "UPDATE $table SET Rating = ? WHERE Id = ?"; 
$sth_rating = $dbh->prepare($sql); 
$sth_rating->execute($rating, $id); 

第二種方法比第一種方法更安全嗎?

+0

你想要完全替換現有場或者如果它存在,只需要更新其評級? http://en.wikipedia.org/wiki/Upsert – Schwern 2011-05-11 07:19:41

+0

除「評級」之外的所有字段都來自另一個表,並且始終是相同的(對於該ID)。 通常情況下,條目將被添加,但如果它們已經存在,則應調整可能的新「評估」值。 – 2011-05-11 07:56:26

回答

4

第二種方法是較少安全,因爲它是非原子的。換句話說,它發生在多個步驟中。考慮兩個更新相同數據的過程。時間在減少。

Process 1      Process 2 

INSERT OR IGNORE... 
           INSERT OR IGNORE... 
           UPDATE... 
UPDATE... 

進程1首先啓動,但進程2潛入並在其之間進行更新。然後,流程1正在進行流程2的更新。

這種情況在這種情況下並不是很糟糕,無論是哪種情況,兩個過程都會相互衝突,但是通過擴展技術可以很容易地陷入麻煩。

(除非我誤解了這個問題,你想要什麼是upsert