插入重复更新

Insert on duplicate update

我有 MySQL table 并且我需要在重复更新时进行查询插入。 "id" 是主键,暂时不需要。

我需要将值 "id2"、"name"、"city" 插入 table。如果 "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'
          ";

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

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

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

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

-- 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 以获得有关如何改善情况的建议。