SATOXのシテオク日記

~ふもっふ、ふもふも~

項目があってもなくても+1するMySQL構文

あまりSQLには詳しくないSATOXさんですけども、ちょっとやりたいことがあって20分ほど悩んで解決した話があったのでご紹介します。
それはMySQLのレコードに項目がなければ追加してカウンタ値に「1」を入れ、既に項目があればカウンタ値をインクリメント(+1)するクエリです。多数の項目はあるであろうそれぞれのカウンタ的な用途なわけですが、簡単な話、zipファイル毎のダウンロードカウンタを作りたかったんです。
 
項目が既にあるかどうかSELECTしてチェックして分岐すれば良さそうなものですが、これくらい必ず1つのクエリでできるべきですわ!と思ったわけです。
テーブル名を「table_name」、カウントしたい項目名を「name」、カウント値を「count」とします。用途的に「name」は重複しないはずなのでプライマリキー、またはユニークにしておきます。「name」,「count」の順です。
 
追加したい項目は「hogehoge」としまが、既に項目がある場合は以下のようにします。

UPDATE 'table_name' SET count=count+1 WHERE name='hogehoge'

ただし、これだとhogehogeが予め存在していないとインクリメントされません。WHERE指定なので、まぁ当然ですよね。これで、失敗したらINSERTするクエリをコールするということにすれば良いのですが、なんだか効率的ではありません。
 
そこで、以下のようにすると……

INSERT INTO 'table_name' VALUES ('hogehoge',1)
ON DUPLICATE KEY UPDATE count=count+1;

hogehogeがなければレコードを追加してcount=1を代入、もし既にhogehogeがあればそのレコードのcountがインクリメントされます。
ビシッと目的達成です。

■MySQL :: MySQL 5.1 リファレンスマニュアル :: 12.2.4.3 INSERT ... ON DUPLICATE KEY UPDATE 構文