最終更新日:
公開日:
レシピ
データベース PostgreSQL
PostgreSQLでデータを更新(UPDATE)
PostgreSQLデータベースのテーブルにあるデータを更新する方法について、「PostgreSQL関数」と「PDO」の2パターンを解説します。
この記事のポイント
- PostgreSQL関数を使ってデータを更新する
- PDOを使ってデータを更新する
目次
テーブルにあるデータを更新する
今回はテーブルに存在するデータを更新していきます。
ここでは「カフェのメニュー」を題材にして、次のようなテーブルを想定して進めていきます。
カラム名 | 型 | その他 |
---|---|---|
id | INT(11) | 主キー |
name | VARCHAR(20) | |
price | INT(11) | |
modify_datetime | DATETIME | |
create_datetime | DATETIME |
「id」はデータを管理する上で便利な一意となるID、「name」と「price」はメニュー名と価格、そして最後の2つはデータ更新日と登録日を示します。
また、テーブルには次のようなデータが登録されていることを前提に進めます。
データの更新方法について、「PostgreSQL関数」と「PDO」の2通りの方法を確認していきます。
PostgreSQL関数でデータを更新する
PostgreSQL関数を使って更新する方法は「pg_query関数」を使う方法と、「pg_update関数」の2通りあります。
2つの違いはSQL文を必要とするかどうか。
pg_query関数はSQL文を指定する必要がありますが、pg_update関数はデータさえあれば不要です。
コードの方がイメージしやすいと思うので、1つずつ見ていきましょう。
pg_query関数
pg_query関数は更新以外にデータの新規登録、削除などでも使うことができる汎用性の高い関数ですが、その代わりSQL文を指定する必要があります。
SQLのUPDATE文の基本構造は次のようになります。
「UPDATE テーブル名 SET カラム名 = 登録したいデータ WHERE 更新するデータを特定する条件式」が基本の形です。
SETの後ろに続く「カラム = 登録したいデータ」で複数のデータを更新したい場合、「,(コンマ)」で区切って指定します。
WHERE句の後ろに続く条件式も同様です。
実際にコードをみていきましょう。
今回は「カフェオレ」の価格を480円から550円に変更します。
コード例
<?php
// Initialize
$res = null;
$pg_conn = null;
$sql = null;
$date = null;
date_default_timezone_set('Asia/Tokyo');
$date = date("Y-m-d");
$pg_conn = pg_connect("host=localhost port=5432 dbname=test user=testuser password=testtest");
if( $pg_conn ) {
$sql = "UPDATE menu SET price = 550, modify_datetime = '$date' WHERE id = 2";
$res = pg_query( $pg_conn, $sql);
var_dump(pg_result_status($res));
} else {
var_dump("接続できませんでした");
}
pg_close($pg_conn);
実行結果
更新前のデータ
更新後のデータ
解説
上記のSQLではカフェオレに該当するデータを更新するために、WHERE句で「id」に「2」を持つデータのみを更新しています。
更新内容は「price(価格)」と「modify_datetime(更新日)」の2つ。
SQL実行前に現在の日時を$dateへ格納し、その内容を登録しています。
扱うデータの型が「文字列型」の場合、値を「‘」で囲ってあげる必要があります。整数型(int)は囲っても問題ありませんが、必須ではないので囲まなくても大丈夫です。
$resの中にはqueryメソッドから返される結果オブジェクトが入ります。
SQLクエリの実行がうまくいったかを判断するには、pg_result_status関数を使って確認することができます。
実行が正常に終了した場合は「1 (int型)」、文法エラーなどで失敗した場合は「false」が入ります。
pg_update関数
pg_update関数はデータの更新のみを行うことができる関数です。
用途は更新のみですが、SQL文が不要なため扱いやすいことが特徴。
主に、次の4つのパラメータを指定して使います。
pg_update関数の基本的なコード例
pg_update( DBオブジェクト, テーブル名, 更新するデータ, 更新対象の条件);
1つ目はDBに関するオブジェクト、2つ目は更新データのあるテーブル名を指定します。
3つ目、4つ目のパラメータは更新後のデータと、更新対象を絞り込むためのデータをそれぞれ指定します。
5つ目のパラメータとしてオプションを指定することも可能ですが、ここでは割愛します。
詳しくはphp.netをご覧ください。
pg_update関数 – php.net
返り値は更新に成功したら「true」を、失敗したら「false」を返します。
実際にコードを確認していきましょう。
カフェオレの価格を「700」へ更新するコードです。
コード例
<?php
// 変数の初期化
$res = null;
$pg_conn = null;
$sql = null;
$date = null;
date_default_timezone_set('Asia/Tokyo');
$date = date("Y-m-d");
$pg_conn = pg_connect("host=localhost port=5432 dbname=test user=testuser password=testtest");
if( $pg_conn ) {
// 更新するデータを絞り込む条件
$key = array(
'id' => 2
);
// 更新後のデータ
$data = array(
'price' => 700,
'modify_datetime' => $date
);
// クエリ実行
var_dump(pg_update( $pg_conn, 'menu', $data, $key));
} else {
var_dump("接続できませんでした");
}
pg_close($pg_conn);
解説
$keyには更新するデータを絞り込む条件を指定しています。
今回はカフェオレの価格を更新したいので、「id」に「2」と指定します。
もう1つの配列$dataには更新後のデータを格納しています。
価格を「700」、そして更新日が実行した日付となるようにセットしています。
これらの値をpg_update関数へ渡して実行することでデータベースの値が更新されます。
成功した場合は「boolean true」が、失敗した場合は「boolean false」を表示して終了です。
PDOでデータを更新する
PDOを使ってデータを登録する場合は、上記のpg_query関数と同様にSQL文を作成して実行します。
PDOオブジェクトのインスタンス作成、データベースへの接続については「PostgreSQLデータベースへ接続」で解説している方法と同じコードを使います。
データを更新するSQL文を作成して、queryメソッドを実行してみましょう。
コード例
<?php
// 変数の初期化
$res = null;
$pdo_conn = null;
$sql = null;
$date = null;
// 現在の日付を取得
date_default_timezone_set('Asia/Tokyo');
$date = date("Y-m-d");
try {
$pdo_conn = new PDO( 'pgsql:host=localhost; dbname=test;', 'testuser', 'testtest' );
// データを更新
$sql = "UPDATE menu SET price = 600, modify_datetime = '$date' WHERE id = 2";
$res = $pdo_conn->query( $sql);
var_dump($res);
} catch(PDOException $e) {
var_dump($e->getMessage());
}
// 接続を切断
$pdo_conn = null;
成功した場合は次のように実行したSQL文が出力され、失敗した場合はfalseが出力されます。
実行結果
object(PDOStatement)[2]
public 'queryString' => string 'UPDATE menu SET price = 600, modify_datetime = '2017-04-26' WHERE id = 2' (length=72)
解説
SQL文自体は上記「PostgreSQL関数でデータを更新する」の中で作成したものと基本的には同じ内容です。
金額のみ「600」に変更しています。
このSQL文はPostgreSQL以外のデータベースでも使うことができます。
こちらの記事は役に立ちましたか?
コメントありがとうございます!
運営の参考にさせていただきます。
ありがとうございます。
もしよろしければ、あわせてフィードバックや要望などをご入力ください。