【问题标题】:MySQL ON DUPLICATE UPDATE with WHERE?MySQL 在哪里重复更新?
【发布时间】:2014-02-08 07:39:39
【问题描述】:

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

我收到以下错误:

语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 'SET balance='40', xplevel='36' WHERE username='nibblenews' AND server='Factions'' at line 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();

【问题讨论】:

  • 什么是“一些问题”?你期望什么,你得到什么?
  • 我希望它插入一行带有值的行,或者像查询中所说的那样用这些值更新一行。我收到yntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SET balance='40', xplevel='36' WHERE username='nibblenews' AND server='Factions'' at line 1'
  • @sonam 是 ON DUPLICATE KEY UPDATE 的点,它会为您选择检查记录是否存在并采取适当的操作(插入或更新现有)
  • @sonam 这不完全正确,MySQL 支持在一个查询中完成:dev.mysql.com/doc/refman/5.0/en/insert-on-duplicate.html

标签: php mysql sql pdo


【解决方案1】:

您不能在 INSERT ... ON DUPLICATE KEY UPDATE 查询中使用显式的 WHERE 语句。正如MySQL docs 所说:

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

换句话说:您指定为UNIQUEPRIMARY 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;

【讨论】:

  • 该更新查询是要使用用户名更新行还是什么?
  • @user3205106 如果您为表中的username 列创建UNIQUE 索引,则可以。
  • 桌子上有一个ID。但我还是不明白它是怎么发现的。
  • @user3205106 那么你仍然应该添加UNIQUE 索引。这样的索引可确保表中的每一行对该列(用户名)都应具有不同的值。这样,MySQL 知道何时会创建重复行(即,用户名何时已在使用中)。您可以通过在数据库上运行以下查询来创建索引(可能在 phpMyAdmin 或您正在使用的任何界面/工具中):CREATE UNIQUE INDEX stats_username_unique ON stats(username);
  • 我一直在努力帮助您找到解决方案,甚至尝试解释每个步骤。但是,您在之前的(现已删除的)评论中说“我也认为您是一个警告干货”。祝你好运找到解决方案,祝你有美好的一天。
猜你喜欢
  • 2014-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2021-01-27
  • 1970-01-01
  • 2012-12-01
相关资源
最近更新 更多