有没有快速的方法来更新SQL中的许多记录?
-
08-07-2019 - |
题
我需要使用我在CodeID创建的新名称替换超过20 000个名称。
例如:我必须更新包含“dog”的所有行(其CodeID为1)具有“cat”,并更新包含“horse”的所有行。 (其CodeID为2)与“bird”等等
第一个SQL语句:UPDATE animalTable SET cDescription
=" cat" WHERE CodeID
= 1
第二个SQL语句:UPDATE animalTable SET cDescription
=" bird" WHERE CodeID
= 2
这些陈述有效,但我需要更快的方法,因为我有超过20 000个名字。
提前谢谢。
解决方案
这是你能做到的最快方式。
或者您想要在一个命令中更新所有记录吗?
你可以用连接进行更新(固定语法......暂时不使用这个)
UPDATE animalTable
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID
SET animalTable.cDescription = CodeTable.Description_1;
另一个选择是将更新分成更小的批次,这将减少表锁定的时间......但更新的总时间将花费更长时间(它只是对性能提升的改进)你可以通过仅更新每批中的某些ID范围。
此外,您可以将该数据放在单独的表中。由于数据未规范化。将它移开,使其更加规范化。
其他提示
您可能希望创建一个包含转换值的临时表,并根据该值进行更新。
例如:
create table #TRANSLATIONS
(
from varchar(32),
to varchar(32)
)
然后,插入翻译值:
insert into #TRANSLATIONS (from,to) values ('cat','dog')
最后,根据以下内容进行更新:
update MYTABLE
set myvalue = t.to
where myvalue = t.from
from MYTABLE m,
#TRANSLATIONS t
(未经测试,脱离我的头脑)。
您可以使用 CASE 声明对其进行更新
UPDATE animaltable SET cDescription = CASE codeID WHEN 1那么'猫'当2'那么'鸟'......结束
假设您有这样的文件:
1,cat
2,bird
...
我会编写一个脚本来读取该文件并为每一行执行更新。
在PHP中:
$f = fopen("file.csv","r")
while($row = fgetcsv($f, 1024)) {
$sql = "update animalTable set cDescription = '".$row[1]."' where CodeID = ".$row[0];
mysql_query($sql);
}
fclose($f);
您可以采取的措施是仅更新那些尚未具有您想要分配的值的记录。
UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat"
此方法使命令仅更新那些尚未“cat”的记录。
免责声明:我讨厌猫。