[前][次][番号順一覧][スレッド一覧]

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]