2011-04-22 83 views
2

我有一個表rating與這些字段rate_id, game_id, rating, ip。讓我們假設這些字段具有以下值1,130,5,155.77.66.55如果存在某些值,則mysql更新,否則創建一個新條目

當用戶試圖把票投給一個遊戲,我想用MySQL來檢查他是否已經投票支持這個遊戲,所以MySQL將檢查是否ipgame_id已經存在,如果他們存在然後MySQL將更新rating的值,否則將創建一個新的條目。

什麼是有效的方法來做到這一點?

回答

7

創建涵蓋ip + game_id的唯一索引。之後,您可以使用INSERT ... ON DUPLICATE KEY UPDATE聲明。

所以總的查詢將會像

INSERT INTO rating (rate_id, game_id, rating, ip) VALUES (1,130,5,'155.77.66.55') 
ON DUPLICATE KEY UPDATE rating = 5 
+0

謝謝你,偉大工程:) – Sotiris 2011-04-22 12:54:57

+0

@Sotiris:這就是爲什麼我在這裏;-) – zerkms 2011-04-22 12:57:22

3

MySQL允許一對插入重複密鑰更新的語法。所以,如果你設置你的密鑰被game_id,USER_ID(或任何方式,您識別用戶),那麼你可以使用INSERT ...上的重複密鑰更新,這將做到這一點:

http://dev.mysql.com/doc/refman/5.5/en/insert.html

0
// check to see if exist 
$sql = "SELECT ip FROM rating WHERE ip=$ip && game_id={$game_id}"; 
$result = mysql_query($sql); 
$row = mysql_fetch_assoc($result); 

if(isset($row['ip'])){ 
    mysql_query("UPDATE HERE"); 
}else{ 
    mysql_query("INSERT HERE"); 
} 
+0

如果有2個同時請求會怎麼樣? – zerkms 2011-04-22 12:55:17

+0

不會像這樣垃圾你的數據庫,檢查@zerkms解決方案,這是更新數據的標準方式 – afarazit 2011-04-22 15:38:28

+0

謝謝,非常感謝。 – David 2011-04-25 12:11:10

0

你也可以看看REPLACE INTO。也許不是這個項目,但以供將來參考:

更換作品酷似INSERT, 不同之處在於,如果一個老行的表 具有相同的值作爲一個 主鍵的新行或唯一索引,老 行被刪除之前的新行是從 插入

dev.mysql.com

相關問題