我需要使用我在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个名字。
提前谢谢。
答案 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'
的记录。”免责声明:我讨厌猫。