MySQLで特定のレコードが存在するかチェックする方法
PHP & MySQL環境で特定のレコードが存在するかどうかを効率的にチェックするSQLクエリ(COUNTとLIMIT 1)と、PDOを用いたPHPでの実装方法を解説します。再利用可能な関数例も紹介。
PHP & MySQL のアプリケーションを開発していて、特定のデータが存在しているのかどうかを調べる、いわゆる「存在チェック」をしたくて調べたのでまとめます。
ちなみにPostgresSQLでも同様の方法で存在チェックできます。
この記事では、「簡単な方法」と「高速な方法」を紹介します。
特段の事情がなければ後者の「高速な方法」をオススメします。
とはいえ、そのテーブルは数千件しかレコードが入っていなかったので私のケースでは大した高速化ではありませんでした。
もちろん大規模なデータセットであれば高速な方法を非常に強くオススメしますし、速ければ速いほど良いので基本的には高速な方法をオススメします。
なお、テーブル名は「users」、指定したいカラム名は「age」とします。
そして35歳のユーザーの存在チェックをしたいケースとして、usersにおいてageが35であるレコードの存在チェックをおこないます。
簡単な方法
ただCOUNTを利用するだけです。
返ってくる結果は 0 か 1 になりますので、それをチェックすれば良いだけです。
ただし、これはシンプルで読みやすくて良いのですが、大規模なデータセットでは、テーブル全体をスキャンする必要があるため、かなり遅くなる可能性があります。
高速な方法
処理をさらに高速にするために、
- COUNTを使わずに 1 とする
- LIMIT 1 を使う
さらに、高速で処理するには LIMIT を追加します。1件だけあれば存在することになるので、ここでは LIMIT 1 としています。
返ってくるのは true か false になります。
こちらの方法なら巨大なデータセットにおいても高速に結果を返すことが可能です。
ただし、たとえばレコード数千件程度では速度の違いを全く感じられないので、COUNTを利用する簡単な方法のほうが一般的かつ読みやすいかもしれません。
PHPで実行するには
PHP & PDOで、上記の高速の方法でSQLを実行し、その後コード側で処理します。
($pdoはPDOコネクション)
細かな注意点として、この場合のPHPの fetchColumn()
メソッドは以下のように値を返すことに気を付けて実装してください。
- レコードが存在する場合、
fetchColumn()
は1
(文字列または整数として)を返します。 - レコードが存在しない場合、
fetchColumn()
はfalse
を返します。
つまり、レコードが存在しても true
を返すことはないことに注意しなくてはならないということです。
おまけ
このような関数を用意しておくと便利です。
呼び出す際には以下のように。
以上です。
実行する際にはテーブル名やカラム名を任意の値に変更してください。