我目前正在向表中插入大量(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重复时插入新行。
答案 0 :(得分:2)
如果$ field_1和$ field_3为PRIMARY KEY
或UNIQUE
索引,则可以使用
$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