プロが教える店舗&オフィスのセキュリティ対策術

PHP + MySQL で登録時に重複チェックをしたいです。
DBには
ID Title Name
1 Book1 Author1
2 Book2 Author2
と3000件ほど入っています。これからも増えていく予定です。

このDBにPHPから新たに100件ほどのレコードを一気に登録したいときに、
・Title名が既にDBに登録されている → 何もせずに次へ
・Title名がまだ登録されていない時 → DBへ登録
と、この様な処理をさせたいと考えています。

現状は登録したい値を配列で回し、一つ一つSELECT文で件数チェックをし、0件で有れば登録。0件以外であれば無視。と、している状況です。
ただこれですと、どうしてもサーバーに負担が掛かってしまう気がするのです。

もし、何か他に良い方法がありましたら教えていただけないでしょうか?
よろしくお願いいたします。

A 回答 (4件)

他の方法の例として、



DBにて、"Title" をunique keyにして、登録時に、
INSERT IGNORE INTO table_name 構文を使ってINSERT する

では如何でしょう。
Mysqlが、勝手に重複しいれば無視して、重複がなければ登録してくれます
    • good
    • 0
この回答へのお礼

これでうまくいきました!!
ありがとうございました!

お礼日時:2010/06/08 13:34

肝心なことを書き忘れた。


Titleがユニークキーの設定をしているならならINSERT IGNORE INTOを使えば重複キーに対しては挿入処理が行われないように処理できます。
    • good
    • 2

>1)重複チェックのSQL文を工夫する


> 例)
> × select * from bookshelf where Title='hoge';
> ○ select 1 from bookshelf where Title='hoge';
普通にcount()関数使った方が良いですから


>ただこれですと、どうしてもサーバーに負担が掛かってしまう気がするのです。
そうとうショボイサーバでなければ100件程度ならそれほど問題はないでしょう。
    • good
    • 0

昨今のサーバーであれば、気にするほどの負荷ではないと思いますが、それでもあえて負荷を考えるとすれば、こんな対策くらいでしょうか。



1)重複チェックのSQL文を工夫する
 例)
 × select * from bookshelf where Title='hoge';
 ○ select 1 from bookshelf where Title='hoge';

 データを取得する必要はないため、SELECT文の列名部分を固定値にすることで
 負荷を若干軽減できます。

2)登録のSQL文を一括実行する
 ループのたびに1件1件実行するのではなく、実行して良い配列にマーク等をつけ、
 最後に一括でinsert文を発行することで負荷を軽減します。

3)そもそも重複チェックをしない
 これはかなり強引な方法ですが、テーブルスキーマのほうでTitleをユニークな列
 として構成し、登録プログラムでは重複チェックをせず、insert文を発行します。
 当然、ランタイムエラーが発生するため、@mysql_queryというようにエラーを表示
 しない工夫等が必要です。

いずれにせよ、サンプルプログラムを作って実際に実機でテストするのが一番です。たぶん、今のままでも危惧するほどの負荷はかかりませんよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!