插入重复更新

时间:2016-12-12 14:55:17

标签: mysql insert on-duplicate-key

我有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'
          ";

1 个答案:

答案 0 :(得分:3)

为了使用ON DUPLICATE KEY UPDATE,您必须创建一个索引,以便在MySQL id2, name的两列中强制实现唯一性,以便能够检测到重复。这将创建一个名为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有关如何改善情况的建议。