3

我需要用给定 CodeID 创建的新名称替换超过 20 000 个名称。

例如:我必须用“cat”更新所有包含“dog”(CodeID 为 1)的行,并用“bird”更新所有包含“horse”(CodeID 为 2)的行,等等。

第一条 SQL 语句:UPDATE animalTable SET cDescription= "cat" WHERE CodeID= 1

第二条 SQL 语句:UPDATE animalTable SET cDescription= "bird" WHERE CodeID= 2

这些陈述有效,但我需要一种更快的方法来做到这一点,因为我有超过 20 000 个名字。

先感谢您。

4

5 回答 5

7

这是你能做到的最快的方法。

或者您想在一个命令中更新所有记录?

您可以使用连接进行更新(固定语法......有一段时间没有使用这个)

UPDATE animalTable 
INNER JOIN CodeTable ON animalTable.CodeID = CodeTable.ID 
SET animalTable.cDescription = CodeTable.Description_1;

另一种选择是将更新分成更小的批次,这将减少表被锁定的时间......但更新的总时间将花费更长的时间(它只是对性能的改进)你可以通过只更新某些来做到这一点每个批次中的 ID 范围。

您也可以将这些数据放在单独的表中。由于数据未标准化。将其移开,使其更加规范化。

于 2009-09-17T07:44:33.943 回答
4

您可能希望创建一个临时表来保存翻译值并基于此进行更新。

例如:

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

(未经测试,在我脑海中浮现)。

于 2009-09-17T07:46:49.977 回答
2

您可以使用CASE语句来更新它:

UPDATE animaltable SET cDescription = CASE codeID WHEN 1 THEN 'cat' WHEN 2 THEN 'bird'.... END
于 2009-09-17T07:45:02.817 回答
1

假设你有一个这样的文件:

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);
于 2009-09-17T07:50:10.157 回答
0

您可以做的是只更新那些还没有您要分配的值的记录。

UPDATE animalTable SET cDescription = "cat" WHERE CodeID = 1 AND cDescription != "cat"

这种方法使命令只更新那些还不是“猫”的记录。

免责声明:我讨厌猫。

于 2015-07-09T16:29:07.940 回答