PG WORKS

PHPやLinuxサーバなどのノウハウや、便利なツールを紹介していきます。

【PHP&MySQL】手っ取り早くMySQLを使いたい方へ INSERT UPDATE DELETE編

f:id:zen6a:20170410235113p:plain
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から実装されたパーティションを使い、条件でデータを分割させるかになると思います。

パーティションは使ったことがないため、ノウハウがたまり次第、記事にしたいと思います。