【PHP&MySQL】手っ取り早くMySQLを使いたい方へ INSERT UPDATE DELETE編
INSERT/UPDATE/DELETEの使い方を、説明していきたいと思います。
PDOの接続や、データ参照(SELECT)方法については、下記の記事をご確認ください。
zen6a.hateblo.jp
データの追加(INSERT)
<?php $sql = "INSERT INTO sample( id, name, pass )VALUES( :id, :name, :pass )"; $sth = $pdo->prepare($sql); $sth->bindValue(':id', 1, PDO::PARAM_INT); $sth->bindValue(':name', "sample", PDO::PARAM_STR); $sth->bindValue(':pass', "sample_pass", PDO::PARAM_STR); // INSERTに失敗したときにエラーを表示 if( !$sth->execute() ){ print_r($sth->errorInfo()); exit; } ?>
データを複数追加(INSERT)
<?php $aryInsertData[] = '('.1.','.'sample'.','.'sample_pass'.')'; $aryInsertData[] = '('.2.','.'sample2'.','.'sample_pass2'.')'; $sql = "INSERT INTO sample( id, name, pass )VALUES".implode(",", $aryInsertData); $sth = $pdo->prepare($sql); // INSERTに失敗したときにエラーを表示 if( !$sth->execute() ){ print_r($sth->errorInfo()); exit; } ?>
同じデータがある場合UPDATEなければINSERT
<?php $aryInsertData[] = '('.1.','.'sample'.','.'sample_pass'.')'; $aryInsertData[] = '('.2.','.'sample2'.','.'sample_pass2'.')'; $aryInsertData[] = '('.3.','.'sample3'.','.'sample_pass3'.')'; $sql = "INSERT INTO sample( id, name, pass )VALUES".implode(",", $aryInsertData)."ON DUPLICATE KEY UPDATE name = VALUES(name)"; $sth = $pdo->prepare($sql); // INSERTに失敗したときにエラーを表示 if( !$sth->execute() ){ print_r($sth->errorInfo()); exit; } ?>
サンプルでは、変数「$aryInsertData」を3列分記載していますが、実際に使う場合、forループで配列を作成し、INSERTしていく処理になると思います。
経験上、一度にたくさんのINSERT配列を作成してデータ追加した方が処理的にも速くなると思いますが、PHPで扱えるメモリサイズ「memory_limit」の設定を確認して追加する量を調整した方が良いと思います。
また、サーバのスペックにもよると思いますが、INSERTする量が多すぎると(例えば一度に1万レコード追加)、サーバに負担がかかりSELECTにも影響でる可能性があります。
こちらも、必要なものだけINSERTさせるか、分散させて追加する方向で考えたほうが良いと思います。
また、INSERTの最後に記述している「ON DUPLICATE KEY UPDATE」は、値の更新もできます。
「ON DUPLICATE KEY UPDATE name = VALUES(name)」
↑VALUES(カラム名)でINSERTする値に更新することが可能になるので、後でUPDATEする必要もなく処理的にも大変便利な機能です。
データの更新(UPDATE)
<?php $sql = "UPDATE sample SET name = :name WHERE id = :id"; $sth = $pdo->prepare($sql); $sth->bindValue(':id', 1, PDO::PARAM_INT); $sth->bindValue(':name', "sample_udpate", PDO::PARAM_STR); // UPDATEに失敗したときにエラーを表示 if( !$sth->execute() ){ print_r($sth->errorInfo()); exit; } ?>
UPDATEに関して、特別注意することは思い当たらないですが、更新する量が多ければ時間がかかるため、テーブルのレコード件数と型のサイズに注意しましょう。
データの削除(DELETE)
<?php $sql = "DELETE FROM sample WHERE id = :id"; $sth = $pdo->prepare($sql); $sth->bindValue(':id', 1, PDO::PARAM_INT); // DELETEに失敗したときにエラーを表示 if( !$sth->execute() ){ print_r($sth->errorInfo()); exit; } ?>
DELETEは、レコード件数が多いほど、処理が遅くなります。
対策としては、LIMITで何回かに分けてDELETEするか、MySQL5.1から実装されたパーティションを使い、条件でデータを分割させるかになると思います。
パーティションは使ったことがないため、ノウハウがたまり次第、記事にしたいと思います。