[英](My)SQL - batch update
嘿,我有一个带有“ id”,“ name”和“ weight”列的表。 重量是一个无符号的小整数。
我有一个页面,显示按“重量ASC”排序的项目。 它将使用拖放操作,更改顺序后,将传递以逗号分隔的ID字符串(在新顺序中)。
假设该表中有10个项目。 这是我到目前为止的内容:
输入样例:
5,6,2,9,10,4,8,1,3,7
示例PHP处理程序(不包括错误处理程序和安全性内容):
<?php
$weight = 0;
$id_array = explode(',', $id_string);
foreach ($id_array as $key => $val)
{
mysql_query("UPDATE tbl SET weight = '$weight' where id = '$val' LIMIT 1");
$weight++;
}
?>
当我更改列顺序时,我的脚本是否需要进行10个单独的UPDATE查询,还是有更好的方法?
您可以创建一个包含新数据的临时表(即id和weight为列),然后使用此数据更新表。
create temporary table t (id int, weight float);
insert into t(id, weight) values (1, 1.0), (2, 27), etc
update tbl inner join t on t.id = tbl.id
set tbl.weight = t.weight;
因此,您有一个create语句,一个insert语句和一个update语句。
您只能在单个查询中指定一个where
子句-这意味着,在您的情况下,一次只能更新一行。
有10个项目,我不知道我是否会遇到这种麻烦(这意味着要重写一些代码-即使那不是那么困难) ,但是,更多的解决方案是:
delete
所有行 insert
它们全部insert
令人高兴的一点是,您可以在单个查询中执行多个insert
; 不知道有10个项目,但对于25个或50个项目,可能会很不错。
使用
VALUES
语法的INSERT
语句可以插入多行。 为此,请包括多个列值列表,每个列值括在括号内并用逗号分隔。
例:
INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
当然,您可能不应该在单个插入查询中插入“太多”项目-每50个项目插入一次就可以了,尽管(要想找到“正确”数量的项目,您必须进行基准测试,我想^^)
是的,您将需要进行10次更新。 有多种方法可以在对mysql_query的单个调用中对多个查询进行批处理,但是最好避免这种情况。
如果您担心它的性能,请确保在尝试之前先尝试一下。 我怀疑进行10次(甚至20或30次)更新会很快。
从概念上讲,10个更新是最简单的方法。 如果您有成千上万的行需要更新,那么您可能必须尝试不同的方法,例如创建临时表并在UPDATE语句中使用JOIN或具有行构造函数的子查询。
将记录存储在带有批处理插入的临时表中,然后从tbl中删除记录,然后从temp表中将批处理插入到tbl中
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.