MySQL插入重复键更新多个值

时间:2010-11-20 01:04:31

标签: php mysql

我目前正在向表中插入大量(100k +)行,如下所示:

//START of a loop

$updatedData[] =  '(
                      "'.$field_1.'",
                      "'.$field_2.'",
                      "'.$field_3.'"
                   )';
//END of loop

$updatedData = implode(',', $updatedData);

$query = "INSERT INTO table (field_1,field_2,field_3) VALUES $updatedData";

这一切都运行得很好,但现在我正在寻找一种更新行的方法,而不是在$ field_1和$ field_3重复时插入新行。

4 个答案:

答案 0 :(得分:2)

如果$ field_1和$ field_3为PRIMARY KEYUNIQUE索引,则可以使用

$query = "REPLACE INTO table (field_1,field_2,field_3) VALUES $updatedData";

<强> - 编辑 -

要做我认为你正在寻找的东西,你需要这样的东西......

INSERT INTO table VALUES $updatedData ON DUPLICATE KEY UPDATE field2=VALUES(field2)

PD:对于大型查询,请不要忘记max_allowed_packet

答案 1 :(得分:1)

只需反击你的$ updatedData。

然后在循环中运行它将按您的意愿运行。

一切顺利。

汉字

答案 2 :(得分:0)

您可以尝试这样的更新语句:

UPDATE table
SET    field2 = '$field2' 
WHERE  field1 = '$field1' 
AND    field3 = '$field3'

然后检查更新的行数是否为零。如果是这样,请执行您已经有效的插入。如果您有大量数据,则可能需要在第一和第三字段上使用某些索引。

如果您的输入数据中有任何引号的机会,您应该在构建查询之前使用这些函数进行清理。不希望从数据迁移中获得SQL注入攻击。

更新:我错过了您的$updatedData是在循环中构建的,并且一次性保留了所有行。我的解决方案一次只能在一行上运行。我能想到的最好的是遍历所有行并尝试像我上面描述的更新。如果更新的行数为零,则将行添加到$insertedData,就像您在问题中添加到$updatedData一样。然后你可以在最后进行大量插入,就像你已经有效一样。

答案 3 :(得分:-1)

我在mysql文档中发现了这个,不知道它是否有效

UPDATE tbl_name SET fld2 = CASE fld1
WHEN val1 THEN data1
WHEN val2 THEN data2
ELSE fld2 END