MySQLのDUPLICATE

            <div class="section">

例えばユーザーのプロフィール情報を保存しておくuser_profilesテーブルに対して、

・新規登録ならばINSERT

・プロフィール更新ならばUPDATE

するとしよう。

user_profiles

id name intro
1 hoge こんにちは

①登録したいユーザーのデータがuser_profilesに存在するかをみる。

②①が存在していればUPDATE、①が存在していなければINSERTをする。

まぁこれだけですが、プログラムで書くと

$sql = 'SELECT id FROM user_profiles WHERE id = 1';
$ret = /*SQLを実行した結果データ*/
if ($retがある) {
 $sql = 'UPDATE user_profiles SET intro = おやすみなさい WHERE name = hoge';
}
else {
 $sql = 'INSERT INTO user_profiles (name, intro) VALUE (hoge, おやすみなさい)';
}
/*$sqlを実行*/

とかなる。

これをもっとシンプルにできるのが「ON DUPLICATE KEY UPDATE」です。

$sql = 'INSERT INTO user_profiles (name, intro) VALUE (hoge, おやすみなさい) ON DUPLICATE KEY UPDATE intro = おやすみなさい';
/*$sqlを実行*/

これだけで動きます。

ただしこれを使うには、挿入する行に主キーかユニークキーが含まれることが条件です。

重複を許さない主キーかユニークキーに対してINSERTをつかい、主キーかユニークキーが重複してしまうと、勝手にUPDATEが使われるらしいです。

データの有り無し便利ですね。

参考

http://dev.mysql.com/doc/refman/5.1/ja/insert-on-duplicate.html