我需要使用我在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”的记录。

免责声明:我讨厌猫。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top