【问题标题】:Insert on duplicate update插入重复更新
【发布时间】:2016-12-12 14:55:17
【问题描述】:

我有 MySQL 表,我需要查询 INSERT ON DUPLICATE UPDATE。 “id”是主键,我现在不需要它。

我需要在表中插入值“id2”、“name”、“city”。如果“id2”和“name”中有相同值的行,则只需更新“city”。 请问我哪里错了?

$query = "INSERT INTO 
             `table` 
               (id2, name, city) 
          VALUES 
               ( '$new_id2', '$new_name', '$new_city') 
          ON DUPLICATE KEY UPDATE 
               city='$new_city' 
          WHERE 
              `id2`='$new_id2' AND `name`='$new_name'
          ";

【问题讨论】:

  • 你得到什么错误信息?
  • 您的语法不正确。 INSERT 语句永远不会有 WHERE 子句。它应该在ON DUPLICATE KEY UPDATE 之后结束
  • 你说If there is some row with the same values in "id2" and "name" 但你只有id2 作为主键。 name 是否也打算成为一个独特的值?
  • 哦,对不起,我误解了你有一个自动增量 idid2 分开。您将需要其他列的唯一索引。我可以在下面发布答案。
  • 如果您无法更改键来创建新索引,则无法使用ON DUPLICATE KEY UPDATE。请注意,创建新索引不需要您删除现有的主键 id。你没有能力跑ALTER TABLE吗?

标签: mysql insert on-duplicate-key


【解决方案1】:

为了使用ON DUPLICATE KEY UPDATE,您必须创建一个索引来强制id2, name 两列的唯一性,以便MySQL 能够检测到重复。这将使用名为idx_uniq_id2_name 的标识符创建索引 `

在您尝试此操作之前,您必须确保您的表中的任何位置都没有多次出现id2, name 的组合。您可以通过以下方式验证:

-- Check for non-unique rows
SELECT id2, name FROM table GROUP BY id2, name HAVING COUNT(*) > 1

如果没有返回行,则可以成功创建多列索引。

-- Create a multi-column unique index
ALTER TABLE `table` ADD UNIQUE INDEX `idx_uniq_id2_name` (`id2`, `name`);

创建索引后,您必须更正INSERT 语句的语法,使其不包含WHERE 子句(INSERT 绝不允许这样做)。

INSERT INTO `table` 
  (id2, name, city)  
  VALUES ('$id2', '$name', '$new_city')
  ON DUPLICATE KEY UPDATE city = '$new_city';

请注意,您在 SQL 语句中使用 $new_city 等变量表明您没有在代码中将 prepare()/execute() 与 PDO 或 MySQLi 一起使用。我建议查看 How can I prevent SQL injection in PHP 以获取有关如何改善这种情况的建议。

【讨论】:

    猜你喜欢
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-21
    • 2021-03-28
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多