mysql:4896
From: "KAWAI,Takanori" <"KAWAI,Takanori" <GCD00051@xxxxxxxxxx>>
Date: Fri, 11 Jan 2002 10:21:51 +0900
Subject: [mysql 04896] Re: 複数のデータを一回で UPDATE する方法
川合孝典です。 ----- Original Message ----- From: "KYLiGHT User" <ram-2k@xxxxxxxxxx> To: <ml@xxxxxxxxxx> Sent: Tuesday, January 08, 2002 11:41 AM Subject: [mysql 04876] 複数のデータを一回で UPDATEする方法 > はじめまして木内といいます。 (中略) > AさんのBirthday(19000203)、BさんのBirthday(19231201)、Cさんの > Birthday(19770313)を一回のUPDATEコマンドで > 変更したいのですが方法が分かりません。 > > 数が少ないなら > $sth=$dbh->prepare(qq{update list set Birthday=$Birthday where > Name=$Name})}); > $sth->execute(); > をループしてやればいいのですが (以下略) 今更ながら、CASE演算子を使えばできそうなことに気が付いたので。 UPDATE list SET Birthday = (CASE Name WHEN 'A' THEN '19000203' WHEN 'B' THEN '19231201' WHEN 'C' THEN '19700313' ELSE Birthday END) WHERE Name in ('A', 'B', 'C') とか。ハードコードが嫌いな場合は、こんなのとか。 my %hVal = ( 'A' => '19000203', 'B' => '19231201', 'C' => '19770313', ); my ($sBirth, $sWhere, @aBirth, @aWhere); $sBirth = 'Birthday = (CASE Name '; foreach my $sKey (keys(%hVal)) { $sBirth .= 'WHEN ? THEN ? ' ; push(@aBirth, $sKey, $hVal{$sKey}); push(@aWhere, $sKey); } $sBirth .= 'ELSE Birthday END)'; $sWhere = 'Name in (' . join(',', (('?')x (scalar(@aWhere)))) . ')'; $hDb->do("UPDATE list SET $sBirth WHERE $sWhere", undef, @aBirth, @aWhere); これで速くなるかどうかは実際にやってみないと分かりませんが。 #インデックスの張り方とか全体の件数にも依存しそうなので。 =================================================== 川合 孝典 (Hippo2000) DBI日本語メーリングリスト管理人、Kansai.pm所属 kwitknr@xxxxxxxxxx GCD00051@xxxxxxxxxx http://member.nifty.ne.jp/hippo2000 http://www.hippo2000.net/ ===================================================
4876 2002-01-08 11:41 [KYLiGHT User <ram-2k] 複数のデータを一回で UPDATE する方法 4877 2002-01-08 15:28 ┣["KAWAI,Takanori" <GC] 4884 2002-01-09 16:44 ┃┗[KYLiGHT User <ram-2k] 4885 2002-01-09 17:21 ┃ ┗["KAWAI,Takanori" <GC] -> 4896 2002-01-11 10:21 ┗["KAWAI,Takanori" <GC]