我在下面的查询中遇到了一些问题。我希望它运行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();
答案 0 :(得分:1)
您无法在WHERE
次查询中使用明确的INSERT ... ON DUPLICATE KEY UPDATE
语句。正如MySQL docs所说:
如果指定
ON DUPLICATE KEY UPDATE
,并且插入的行会导致UNIQUE
索引或PRIMARY KEY
中的重复值,则MySQL会执行旧行的更新。
换句话说:您指定为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;