MySQL обновление, если некоторые значения существуют, в противном случае создайте новую запись - PullRequest
2 голосов
/ 22 апреля 2011

У меня есть таблица rating с этими полями rate_id, game_id, rating, ip.Предположим, что эти поля имеют следующие значения 1,130,5,155.77.66.55

Когда пользователь пытается проголосовать за игру, я хочу с помощью mysql проверить, голосовал ли он уже за эту игру, поэтому mysql проверит, если ipи game_id уже существует, если они существуют, mysql обновит значение rating, в противном случае создаст новую запись.

Какой эффективный способ сделать это?

Ответы [ 4 ]

7 голосов
/ 22 апреля 2011

Создать уникальный индекс, охватывающий 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
3 голосов
/ 22 апреля 2011

MySQL допускает синтаксис обновления дублирующего ключа для INSERT.Поэтому, если вы установите свой ключ на game_id, user_id (или каким-либо другим способом, которым вы идентифицируете пользователя), вы можете использовать INSERT ... для DUPLICATE KEY UPDATE, который будет делать только это:

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

0 голосов
/ 22 апреля 2011

Вы также можете взглянуть на REPLACE INTO.Возможно, не для этого проекта, но для дальнейшего использования:

REPLACE работает точно так же, как INSERT, за исключением того, что если старая строка в таблице имеет то же значение, что и новая строка для PRIMARY KEY или UNIQUE индексастарая строка удаляется перед вставкой новой строки

из: dev.mysql.com

0 голосов
/ 22 апреля 2011
// 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");
}
...