我有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'
";
答案 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有关如何改善情况的建议。