MySQL ON DUPLICATE UPDATE с ГДЕ?

У меня возникают некоторые проблемы с запросом ниже. Я хочу, чтобы он запускал запрос UPDATE, если theres уже является строкой для пользователя в базе данных. Я ожидаю, что он будет вставлять строку со значениями или обновлять строку со значениями, как это говорит в запросе.

Я получаю следующую ошибку:

синтаксическая ошибка или нарушение доступа: 1064 У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'SET balance = '40', xplevel = '36 'WHERE username =' nibblenews 'AND server =' Factions '' в строке 1 '

$stmt = $db->prepare('INSERT INTO stats (balance, xplevel, username, server) VALUES (:balance, :xp, :username, :server) ON DUPLICATE KEY UPDATE stats SET balance=:balance2, xplevel=:xp2 WHERE username=:username2 AND server=:server2'); $stmt->bindParam(':balance', $balance, PDO::PARAM_STR); $stmt->bindParam(':balance2', $balance, PDO::PARAM_STR); $stmt->bindParam(':xp', $xp, PDO::PARAM_STR); $stmt->bindParam(':xp2', $xp, PDO::PARAM_STR); $stmt->bindParam(':username', $username, PDO::PARAM_STR); $stmt->bindParam(':username2', $username, PDO::PARAM_STR); $stmt->bindParam(':server', $server, PDO::PARAM_STR); $stmt->bindParam(':server2', $server, PDO::PARAM_STR); $stmt->execute(); 

Solutions Collecting From Web of "MySQL ON DUPLICATE UPDATE с ГДЕ?"

Вы не можете использовать явный WHERE в INSERT ... ON DUPLICATE KEY UPDATE . Как говорится в документах MySQL :

Если вы укажете ON DUPLICATE KEY UPDATE , и будет вставлена ​​строка, которая приведет к дублированию значения в индексе UNIQUE или PRIMARY KEY , MySQL будет выполнять UPDATE старой строки.

Другими словами: столбцы, которые вы указали как UNIQUE или PRIMARY KEY , используются для проверки того, существует ли строка уже. Если это так, эта строка обновляется.

Кроме того, stats SET в вашем запросе (после ON DUPLICATE KEY UPDATE ) недействительна. Вы должны изменить свой запрос на что-то вроде этого:

 INSERT INTO stats (balance, xplevel, username, server) VALUES (:balance, :xp, :username, :server) ON DUPLICATE KEY UPDATE balance=:balance2, xplevel=:xp2;