有没有快速的方法来更新SQL中的许多记录?

时间:2009-09-17 07:35:42

标签: mysql sql replace phpmyadmin sql-update

我需要使用我在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个名字。

提前谢谢。

5 个答案:

答案 0 :(得分:7)

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

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

你可以用连接进行更新(固定语法......暂时不使用这个)

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

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

此外,您可以将该数据放在单独的表中。由于数据未规范化。将它移开,使其更加规范化。

答案 1 :(得分: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

(未经测试,脱离我的头脑)。

答案 2 :(得分:1)

您可以使用CASE语句进行更新

UPDATE animaltable SET cDescription = CASE codeID WHEN 1那么'猫'当2'那么'鸟'......结束

答案 3 :(得分: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);

答案 4 :(得分:0)

您可以采取的措施是仅更新那些尚未拥有您想要分配的值的记录。

firewalls:
    login:
        pattern:   ^/login/
        anonymous: true # On autorise alors les anonymes sur ce pare-feu
    register:
        pattern:   ^/register/
        anonymous: true # On autorise alors les anonymes sur ce pare-feu
    main_login:
        pattern:   ^/home$
        anonymous: true # On autorise alors les anonymes sur ce pare-feu
    main:
        pattern: ^/
        form_login:
            provider: fos_userbundle
            login_path: user_security_login
            check_path: user_security_check
            csrf_provider: form.csrf_provider
        logout:       true
        remember_me:
            key:   %secret%
        anonymous:    false

此方法使命令仅更新那些尚未“cat'

的记录。”

免责声明:我讨厌猫。