MySQL на дубликате обновления с помощью WHERE?

php mysql sql pdo

667 просмотра

1 ответ

18 Репутация автора

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

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

синтаксическая ошибка или нарушение доступа: 1064 В синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, на предмет правильного синтаксиса, который можно использовать рядом с 'SET balance = '40', xplevel = '36 'WHERE username =' nibblenews 'И 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();
Автор: user3205106 Источник Размещён: 19.01.2014 12:58

Ответы (1)


1 плюс

5040 Репутация автора

Решение

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

Если вы укажете ON DUPLICATE KEY UPDATE, и будет вставлена ​​строка, которая приведет к дублированию значения в UNIQUEиндексе или PRIMARY KEYMySQL выполнит ОБНОВЛЕНИЕ старой строки.

Другими словами: столбцы, которые вы указали как 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;
Автор: Jonathan Размещён: 19.01.2014 01:03
Вопросы из категории :
32x32