MySQL ON DUPLICATE UPDATE与WHERE?

时间:2014-01-19 00:58:24

标签: php mysql sql pdo

我在下面的查询中遇到了一些问题。我希望它运行UPDATE查询,如果数据库中的用户已经有一行。我希望它插入一个包含值的行,或者更新一行,其值与查询中的值一样。

我收到以下错误:

  

语法错误或访问冲突: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();

1 个答案:

答案 0 :(得分:1)

您无法在WHERE次查询中使用明确的INSERT ... ON DUPLICATE KEY UPDATE语句。正如MySQL docs所说:

  

如果指定ON DUPLICATE KEY UPDATE,并且插入的行会导致UNIQUE索引或PRIMARY KEY中的重复值,则MySQL会执行旧行的更新。

换句话说:您指定为UNIQUEPRIMARY KEY的列用于检查该行是否已存在。如果是,则更新该行。

此外,您的查询stats SETON DUPLICATE KEY UPDATE之后)无效。您应该将查询更改为以下内容:

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