phpPgAdmin導入メモ

2007年12月 3日 02:02 phpPgAdmin導入メモ

今回も旧ブログから記事を引っ張ってきました。

2年半以上前の記事ですが、まあ何かの参考にはなるかな、と。

というわけで、以下は過去に使っていたレンタルサーバーでの phpPgAdmin のインストール手順のメモです。


1. はじめに

phpPgAdminは、PostgreSQLデータベースをGUIで操作するためのWebアプリケーションです。名前の通り、プログラム本体はPHPで記述されていますので、PHPの動作する環境でないと使えません。

このphpPgAdminのことは以前から知っていたのですが、今までSSHでサーバーにログインしてコマンドラインからpsqlを起動しての管理に特に不便を感じていなかったことと、インストールがめんどくさそう、という理由から導入は見送っていました。

が、つい先日別のWebサーバーでphpPgAdminを使う機会があって、その想像以上の操作の便利さに導入を決めました。
以下はこのサイトで使っているレンタルサーバーでのphpPgAdmin 3.5.3の導入手順です。

※ちなみに、同じようにPHPで記述されたMySQL管理用のWebアプリケーション「phpMyAdmin」というのもあります(というかこっちの方が有名かも)。

2. phpPgAdminのダウンロード

phpPgAdmin公式サイトより、ソースコード本体をダウンロードします。


3. config.inc.php の編集

ダウンロードしたファイルを解凍し、 conf/ ディレクトリを開きます。
config.inc.php-dist というファイルがあるので、同一ディレクトリ内に config.inc.php という名前でこれのコピーを作ります。
※config.inc.php-dist は設定ファイルのデフォルトの状態が記述されたファイルなので、万が一のために残しておく方が良いかと思われます。

コピーした config.inc.php をテキストエディタで開き、下記のように編集しました。

// データベース名を自分の使用しているものに変更
$conf['servers'][0]['defaultdb'] = 'template1';
  ↓
$conf['servers'][0]['defaultdb'] = 'amethyst';

// 画面に表示される言語を英語から日本語に変更
$conf['default_lang'] = 'english';
  ↓
$conf['default_lang'] = 'japanese';

// レンタルサーバーを利用しているため、他のユーザーアカウントのDBが見えてしまうと
// 邪魔&色々困るのでownerが私になってるものだけ表示するように設定
$conf['owned_only'] = false;
  ↓
$conf['owned_only'] = true;

4. ひたすらアップロード

編集した config.inc.php を含む全ファイルをアップロードします。


5. Basic認証の設定

自分以外の人間にphpPgAdminでDBをいじられるととっても困るので、phpPgAdminをインストールしたディレクトリにBasic認証をかけておきます。
Basic認証のかけ方は.htaccessによるBasic認証のかけ方等を参照。


6. 動作確認

phpPgAdminをインストールしたディレクトリの index.php にアクセスします。
ログインフォームが表示されるので、PostgreSQLのユーザー名とパスワードを入力し、ログインできればインストールは正常に完了しているかと思われます。

後はお好きなように。

関連するブログ記事
カテゴリー
PHP | PostgreSQL
タグ
.htaccess | Basic認証 | CMS | PHP | phpPgAdmin | PostgreSQL | RDBMS

コメント(2)

 

PostgreSQL で連番の数字のフィールドを作る方法 (sequence について)

データベースでデータを管理する上で、何らかの連番の数字を割り振って、一意の ID とするのは、よくある手法かと思います。

例えば「最近飲んだお酒リスト」なんていうテーブルがあったら、

LiquorList
LiquorID LiquorName LiquorDate
1 モスコミュール 2007-11-26
2 白ワイン 2007-11-27
3 モスコミュール 2007-11-28
4 モスコミュール 2007-11-29
5 ウォッカ 2007-11-30

こんな感じで、「LiquorID」に数字を連番で振っていく、というケースですね。

こういう風に、順番に番号を振っていく際に使うのが、sequence(シーケンス)というものです。

sequence (シーケンス) の作成

sequence (シーケンス) は、「create sequence シーケンス名 オプション」という SQL文で、作成できます。

例えばシンプルに、1 からスタートして、1 ずつ増加していく「LiquorID_seq」シーケンスを作る場合は、下記のような SQL文になります。

create sequence LiquorID_seq;

初期値を 1 ではなく、例えば 10001 にしたい場合は、「start」というオプションをつけて、

create sequence LiquorID_seq start 10001;

とやれば OK 。

sequence (シーケンス) を使ったテーブルへのデータ追加 (insert文)

とりあえず、連番の数字を管理するためのシーケンスはできあがりました。

次は、実際にこのシーケンスで管理している数字を、テーブルに反映しないといけないわけです。

前述の「最近飲んだお酒リスト」の例だと、「2007年12月1日はビールを飲んだ」場合、このテーブルに 6番目のデータとして、

  • LiquorID ⇒ 6
  • LiquorName ⇒ ビール
  • LiquorDate ⇒ 2007-12-01

を追加する必要があります。

で、LiquorID の連番の数字は先ほど作成したシーケンス「LiquorID_seq」で管理しているので、そのデータを参照する必要があります。

シーケンスで管理している連番の数字の「次の番号」を取得する際には「nextval」という関数を利用します。

具体的には、

insert into LiquorList (LiquorID, LiquorName, LiquorDate)
values (nextval('LiquorID_seq'), 'ビール', '2007-12-01');

という SQL文でデータを追加すれば、自動的にLiquorIDには「次の数字」である 6 が入るわけです。

nextval 関数を呼び出したら、自動的に、参照したシーケンス内の数値は「次の数字」に更新されるので、楽チンです。

もっと楽に連番を発行する方法

実は、create table 文でテーブルを作成する際に、フィールドに対して「serial」というデータ型を指定すれば、勝手にシーケンスを作って、データ挿入時も勝手に連番を発行してくれます。

なので今回の例の場合でも、最初にテーブルを作る際に、

create table LiquorList (
LiquorID serial PRIMARY KEY,
LiquorName text NOT NULL,
LiquorDate timestamp NOT NULL);

みたいな感じにしておけば、勝手に LiquorList_LiquorID_seq という名前のシーケンスも同時に作成してくれます。

さらに、その後テーブルにデータを追加する際も、

insert into LiquorList (LiquorName, LiquorDate) values ('ソルティドッグ','2007-12-02');

という風に、LiquorID には何も指定せずに insert しても、自動的に LiquorID には LiquorList_LiquorID_seq の「次の数字」が入ってくれます。
凄く楽です。

関連するブログ記事
カテゴリー
PostgreSQL
タグ
PostgreSQL | RDBMS | sequence | serial型 | SQL | コマンドライン | シェル

コメント(16)

 

PostgreSQLで複数のテーブルを結合して処理する方法

今日は久々に旧ブログから記事を引っ張ってきました。

以下は二年以上前に書いたブログ記事の転載です。


新鮮なネタがないので、ストックの中からPostgreSQLネタでも。
というわけで、PostgreSQLで複数のテーブルを結合して処理する方法のメモです。

「複数のテーブルを結合して集計する」というのがどういう意味かと言うと、例えばまず会員制のショッピングサイトなどでユーザーの情報を管理するDBがあると仮定します。
で、一つ目のテーブル「TABLE1」には下記のように、ユーザーID・ユーザーの氏名・ユーザーのメールアドレス等の基本情報が格納されているとします。

TABLE1
UserID UserName MailAddress
Amethyst 鬼瓦 権三郎 amethyst@amethyst-web.org
Alexandrite 俵田山 兼松 alexandrite@amethyst-web.org
Sapphire 平等院 鳳凰堂 sapphire@amethyst-web.org

次に、二つ目のテーブル「TABLE2」には、各ユーザーの購入商品の情報が格納されているとします。
例えば、注文ID・注文者のユーザーID・商品名・商品価格etc。

TABLE2
OrderID UserID ItemName ItemPrice
1 Amethyst 扇風機 2980
2 Amethyst エアコン 99800
3 Sapphire コーヒーメーカー 2800
4 Amethyst 電気コタツ 5800
5 Alexandrite 上戸彩写真集 4800
6 Sapphire マグカップ 1200
7 Alexandrite エロマンガ 980

さて、上記の注文商品の情報が格納されたTABLE2のデータを元に、注文したユーザー宛に一括で受注確認のメールを送信するプログラムを作りたい時、どうすれば良いでしょうか。

単純に処理しようと思えば、まずTABLE2のデータを一行ずつ取得し、その情報の中からユーザーIDを取得し、次にそのユーザーIDをキーにしてTABLE1からメールアドレスを取得、という流れになります。
perlで書くと、下記のような感じ

#-- TABLE2のデータを取得
$SQLstat1 = $DB->prepare("select OrderID, UserID, ItemName, ItemPrice from TABLE2");
#-- 一行ずつ処理する
while(@DATA = $SQLstat1->execute){
    #-- 取得したデータを変数にセット
    ($OrderID,$UserID,$ItemName,$ItemPrice) = @DATA;
    #-- $UserIDをキーにしてTABLE1のデータを取得
    $SQLstat2 = $DB->prepare("select UserName, MailAddress from TABLE1 where UserID = '$UserID'");
    #-- 取得したデータを変数にセット
    ($UserName,$MailAddress) = $SQLstat->execute;
    #-- 以下にメール送信の処理が入る
    &SendMail;
}

※上記の処理の場合は、実際にはプレースホルダを使った方が良いと思いますが、ここでは処理の流れをわかりやすくするために敢えてこういう記述にしました。

さて、上記のスクリプトの場合は一つ目のselect文の中で何度も別のselect文を発行していることになります。
が、select文にinner joinという句を使うと、一度のSQL文で上記の処理を済ますことができます。
↓こんな感じ。

#-- TABLE2のデータを元にTABLE1からUserIDをキーにしてデータを取得
$SQLstat = $DB->prepare("select TABLE2.OrderID, TABLE2.UserID, TABLE2.ItemName,
 TABLE2.ItemPrice, TABLE1.UserName, TABLE1.MailAddrss
 from TABLE2 inner join TABLE1 on TABLE2.UserID = TABLE1.UserID");
#-- 一行ずつ処理する
while(@DATA = $SQLstat->execute){
    #-- 取得したデータを変数にセット
    ($OrderID,$UserID,$ItemName,$ItemPrice,$UserName,$MailAddress) = @DATA;
    #-- 以下にメール送信の処理が入る
    &SendMail;
}

上記スクリプトの
from TABLE2 inner join TABLE1 on TABLE2.UserID = TABLE1.UserID
の部分がポイントです。
これは「TABLE2とTABLE1を結合するよ。条件として"TABLE2のUserIDとTABLE1のUserIDが同じ"データを結合してね」
ということです。
ちなみに、上記select文で出てくる TABLE2.OrderID とか TABLE1.UserID とかはそれぞれ「TABLE2内のOrderID」「TABLE1内のUserID」を表します。

このinner join句は、select文だけではなくupdate文にも使えますので何かと便利です。
delete文には使った記憶がないのでよくわかりません。多分使えるんじゃないですかね?

関連するブログ記事
カテゴリー
PostgreSQL | perl/CGI
タグ
inner join | perl | PostgreSQL | RDBMS | SQL | コマンドライン | シェル

コメント(25)

 

perlでPostgreSQL

2007年8月11日 23:59 perlでPostgreSQL

今回も旧サイトからネタを引っ張ってきました。すんません。

PostgreSQL関連は早めに転載しとかないと、色々と困るので......。


DBIモジュールを使用する

perlにはデータベースを操作するためのモジュール「DBI」が用意されている。
Windows用のActivePerlを使う場合は、2003年3月現在は別途DBIモジュールをインストールしないといけない。
詳しいやり方は忘れた。DOS窓からppmコマンドで色々やったらインストールできたはず。

とりあえず、

#-- DBIモジュールの使用を宣言
use DBI;

データベースに接続

DBIモジュールを使ってPostgreSQLデータベースに接続するには、connect ステートメントを使用する。
「Amethyst」という名前のデータベースに、アカウント名「amethyst」パスワード「abcdefg」で接続する場合、下記のようにする。

#-- データベースに接続
$DB = DBI->connect("DBI:Pg:dbname=Amethyst","amethyst","abcdefg");

一つのプログラムで何度もデータベースに対してSQL文を発行する場合は、 その都度connectしたりせずにプログラムの最初に connect して、全ての処理が終わったら disconnect した方が良いらしい。


データの編集

データベース内のデータの編集関連のSQL文(insert,update,delete)の使用例。

#-- insert文の使用例
#-- SQL文を変数 $SQLstatに格納
$SQLstat = $DB->prepare("insert into $table_name (ID,Name) values ($id,$name)");
#-- SQL文を実行
$RESULT = $SQLstat->execute;
#-- 実行したSQL文を破棄
$SQLstat->finish;

#-- update文の使用例
#-- SQL文を変数 $SQLstatに格納
$SQLstat = $DB->prepare("update $table_name set Name='$name' where ID = '$id'");
#-- SQL文を実行
$RESULT = $SQLstat->execute;
#-- 実行したSQL文を破棄
$SQLstat->finish;

#-- delete文の使用例
#-- SQL文を変数 $SQLstatに格納
$SQLstat = $DB->prepare("delete from $table_name where ID = '$id'");
#-- SQL文を実行
$RESULT = $SQLstat->execute;
#-- 実行したSQL文を破棄
$SQLstat->finish;

SQL文内に変数を用いる場合も、数値以外はシングルクォーテーション「'」で括ること。

各SQL文を execute すると、結果が変数 $RESULT に代入される。
$RESULT に代入される値はSQL文実行によって変更のあった列数なので、処理実行後 $RESULT の値を調べることで、エラーチェックができる。

#-- エラーチェック
if($RESULT < 1){die print 'データの編集に失敗しました';}

データの検索

データベース内のデータの検索のためのSQL文(select)の使用例。

#-- SQL文を変数 $SQLstatに格納
$SQLstat = $DB->prepare("select * from $table_name where Name like '%$name%'");
#-- SQL文を実行
$SQLstat->execute;
#-- マッチした件数を取得
$match = $SQLstat->rows;
print qq|$match 件 マッチしました。\n\n|;
#-- マッチしたデータを配列 @DATA に順番に格納
while(@DATA = $SQLstat->fetchrow_array){
	($ID,$NAME,$PASS,$MAIL,$BIRTH) = @DATA;
	print qq|ID: $ID\n|;
	print qq|Name: $NAME\n|;
	print qq|Password: $PASS\n|;
	print qq|Email: $MAIL\n|;
	print qq|Birthday: $BIRTH\n|;
	print qq|\n|;
}
#-- 実行したSQL文を破棄
$SQLstat->finish;

rows は、execute したSQL文にマッチした列数を返す。
fetchrow_array は、実行されるたびに、execute したSQL文で取り出した列を順番に一行ずつ配列として返す。


プレースホルダ

下記のように、ループの中で何度も似たようなSQL文を prepare して execute して finish するのは非効率的らしい。

foreach $ID (keys(%NAME)){
	$SQLstat = $DB->prepare("update $table_name set Name='$NAME{'$ID'}' where ID = $ID");
	$RESULT = $SQLstat->execute;
	$SQLstat->finish;
	if($RESULT < 1){die print qq|ID: $ID, Name: $NAME{'$ID'} の更新に失敗しました。\n|;}
}

こういう時は、ループの外でSQL文を prepare し、変数が入る部分には「?」を入れておく。
この「?」をプレースホルダと呼ぶらしい。

$SQLstat = $DB->prepare("update $table_name set Name=? where ID = ?");
foreach $ID (keys(%NAME)){
	$RESULT = $SQLstat->execute($NAME{'$ID'},$ID);
	if($RESULT < 1){die print qq|ID: $ID, Name: $NAME{'$ID'} の更新に失敗しました。\n|;}
}
$SQLstat->finish;

このように、execute する際にプレースホルダにバインドする順番に変数を渡してやると、意図通りに実行される。
また、execute する前に bind_param でプレースホルダにバインドする値を指定する方法もある。

$SQLstat = $DB->prepare("update $table_name set Name=? where ID = ?");
foreach $ID (keys(%NAME)){
	$SQLstat->bind_param(1,$NAME{'$ID'});
	$SQLstat->bind_param(2,$ID);
	$RESULT = $SQLstat->execute;
	if($RESULT < 1){die print qq|ID: $ID, Name: $NAME{'$ID'} の更新に失敗しました。\n|;}
}
$SQLstat->finish;

bind_param 時に渡す値は「何番目のプレースホルダなのか」という数値と、「バインドする値」の二つ。


データベースとの接続を終了する

データベースを操作する処理が終了したら、データベースとの接続を終了する。

#-- データベースとの接続を終了
$DB->disconnect;
関連するブログ記事
カテゴリー
PostgreSQL | perl/CGI
タグ
perl | PostgreSQL | RDBMS | SQL

コメント(6)

 

PostgreSQLの初歩

2007年8月 7日 23:59 PostgreSQLの初歩

毎度毎度、旧サイトからの転載で申し訳ないんですが……。
ちょうど今日客先でWebアプリ構築の仕事をやっていて、単純なSQL文すら忘れていることに愕然としたんですよ。

最近、PostgreSQLを全然触ってなかったからなぁ……。
こんな程度を忘れるのはさすがに自分でも酷いと思うけど。

結局、客先でWayBack Machineから自分の旧サイトをひっぱり出して、これを調べる始末。

なので次に同じことが起きたときのために、今のうちにこっちに移しておきます。

というわけで、以下は旧サイトからの転載です。


データベースを作る

シェル上で createdb コマンドを実行。

% createdb Amethyst	# "Amethyst"はデータベース名
CREATE DATABASE	# レスポンス

これでデータベース作成完了。
レンタルサーバーなんかだと、最初から自分のアカウント名のデータベースを用意してくれてることが多いみたい。
そういうところは大抵自分で新たにデータベースを作成することはできないと思う。
そんな場合はデータベース作成は飛ばして次へ。


psqlの起動

シェル上で psql コマンドを実行する。引数としてデータベース名を指定。
この際、引数を指定しない場合は自動的に自分のアカウント名が引数にセットされる。

% psql Amethyst
# 以下、レスポンス
Welcome to psql, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help on internal slash commands
       \g or terminate with semicolon to execute query
       \q to quit
# ここまで
Amethyst=>

psqlを起動すると、プロンプトは「データベース名=>」になる。
この際、設定によってはユーザー名やパスワードを要求されることもある。

psql起動中は、SQL文の他に「internal slash commands」(個人的に「\コマンド」と呼んでる)とやらが使える。
個人的によく使うのは以下。

  • \q psqlの終了
  • \d データベース内のテーブルを一覧表示
  • \h SQL文のヘルプを表示
  • \? \コマンドの一覧表示

テーブルの作成

テーブルの作成は
「create table テーブル名 ( フィールド(列)名 データ型 オプション , フィールド名 データ型 オプション , ……);」
というSQL文で行う。
create table に限らず全てのSQL文のラストには、セミコロン「;」をつけなければならない。
逆に言うと、セミコロンをつけるまで、一つのSQL文を何行にも渡って記述することも可能。
というか、そうしないとやってられない。

ID,Name,Password,Email という四つのフィールド持つ UserList というテーブルを作るには下記のようにする。

Amethyst=> create table UserList (
# 以下、括弧内の部分を記述しているということが一目でわかるよう
# プロンプトが「(>」に変わるところが便利
Amethyst(> ID text PRIMARY KEY,
Amethyst(> Name text NOT NULL,
Amethyst(> Password text NOT NULL,
Amethyst(> Email text
Amethyst(> );
# 以下、レスポンス
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 'userlist_pkey' for table 'userlist'
CREATE

フィールド「ID」に「PRIMARY KEY」のオプションをつけたので、自動的に「userlist_pkey」というindexが作成される。
indexが何なのか理屈はよく知らないけど、とりあえずこれでIDをキーに検索するときは効率が良くなるらしい。


データ型

個人的によく使う、フィールドのデータ型は下記。

numeric
バイト数可変の1000桁までの正数と小数。
数値を格納するフィールドはよっぽど特殊な場合以外はこれでOKだと思う。
text
バイト数可変の文字列。
上に同じく文字列を格納するフィールドはよっぽど特殊な場合以外はこれでOKだと思う。
timestamp
日付・時刻。
入力・取り出しは「2003-04-20 17:05:06」の形式が使いやすいと思う。
inet
IPアドレス。
ネットワーク系の処理のために使うのでなければtext型でも充分だけど、せっかく専用のデータ型が用意されてるので使ってるだけ……。

オプション

個人的によく使う、フィールドのオプション(という呼び方は正しくないような気もするけど)は下記。

PRIMARY KEY
ひとつのテーブルにつきひとつのフィールドにしか指定できない。
indexが作成されるので、このフィールドをキーにした検索は効率が良いらしい。
フィールドが一意で、かつ、NULLではないという条件がある。
UNIQUE
ひとつのテーブル内の複数のフィールドに指定できること以外は PRIMARY KEY と基本的に同じだと思う。
PRIMARY KEY に指定したフィールドは、自動的に UNIQUE も指定されている。
NOT NULL
NULL値を認めないフィールドに指定。
PRIMARY KEY や UNIQUE に指定したフィールドは、自動的に NOT NULL も指定されている。
DEFAULT value
新たな行が追加された時に、自動的に挿入されるデフォルト値(value)を指定できる。

フィールドの追加

既存のテーブルにフィールドを追加する時は
「alter table テーブル名 add フィールド名 データ型 オプション;」
というSQL文で行う。

先程作ったテーブル UserList に BirthDay というフィールドを追加する場合は下記のようにする。

Amethyst=> alter table UserList add BirthDay timestamp;
ALTER TABLE	# レスポンス

numeric型のフィールドを追加する時は、デフォルト値として 0 をセットしといた方が良いと思う。
そうしないと、フィールドを追加する前に存在した行の該当フィールドの値は全てNULLになるため後々不便(0 と NULL は別物なので)。
perlからデータベースを使う場合は特に。


既存フィールドのデフォルト値の設定

既存のフィールドの DEFAULT value の設定・変更は
「alter table テーブル名 alter フィールド名 set default デフォルト値;」
というSQL文で行う。

先程作ったテーブル UserList の Email フィールドにデフォルト値 anonymous を設定する場合は下記のようにする。

Amethyst=> alter table UserList alter Email set default 'anonymous';
ALTER TABLE	# レスポンス

なお、デフォルト値の設定を破棄する場合は「set default デフォルト値」の代わりに「drop default」を使う。

Amethyst=> alter table UserList alter Email drop default;
ALTER TABLE	# レスポンス
2003.04.26 追記

データの挿入

テーブルにデータを挿入するときは
「insert into テーブル名 (フィールド名1,フィールド名2,……) values (値1,値2,……);」
というSQL文で行う。

先程作ったテーブル UserList にデータを挿入する場合は下記のようにする。

Amethyst=> insert into UserList(
Amethyst(> ID,Name,Password,Email,BirthDay)
Amethyst-> values (	# SQL文の途中、かつ括弧内でない場合のプロンプトは「->」になる
Amethyst(> '00001',
Amethyst(> 'Amethyst',
Amethyst(> '01234567',
Amethyst(> 'amethyst@amethyst-web.org',
Amethyst(> '1976-05-06'
Amethyst(> );
INSERT 2910628 1	# レスポンス

値を入力するとき、数値以外はシングルクォーテーション「'」で囲むこと。


データの表示

テーブル内のデータを表示するときは
「select フィールド名1,フィールド名2,…… from テーブル名 条件 (ソート方法);」 というSQL文で行う。

先程作ったテーブル UserList から、「Emailが空でないデータのみ、NameとEmailを表示」する場合は下記のようにする。

Amethyst=> select Name,Email from UserList where Email != '';
# 以下、レスポンス
   name   |           email
----------+---------------------------
 Amethyst | amethyst@amethyst-web.org
(1 row)	# マッチした件数(行数)が表示される

全てのフィールドを表示したい時は、フィールド名をアスタリスク「*」一文字にするだけでOK。
「select * from テーブル名 条件 (ソート方法)」

where句以下の条件を指定しなければ、テーブル内のデータ全てが表示される。

特定のフィールドの値を元に昇順にソートして表示したい場合は、select文末尾に「order by フィールド名」
降順にソートして表示したい場合は「order by フィールド名 desc」


データの検索

前項の例のように、データの検索には
「where 条件」
という句をSQL文に追加して実行する。

単純にフィールドが条件と合致しているものを検索するには「where フィールド名 = 条件」。

複数の条件で検索するには「where フィールド名 in(条件1,条件2,……)」

逆に条件と合致していないものを検索するには「where フィールド名 != 条件」。

値の一部が合致しているものを検索するには「where フィールド名 like 条件」。
「%」が「0文字以上の何か」を表すので、「Aから始まる文字列」の検索は「where フィールド名 like 'A%'」という感じ。

numeric型やtimestamp型では「> < <= >=」もよく使う。

and や or を使って、複数の条件を指定するすることも可能。

別のテーブルの検索結果を条件に指定することも可能。
「where フィールド名 in (select文)」


データの更新

既存のデータの値を更新する時は
「update テーブル名 set フィールド名1=値1,フィールド名2=値2,…… 条件(where句)」
というSQL文で行う。

先程挿入したデータのPassword「01234567」を「abcdefgh」に変更する場合は下記のようにする。

Amethyst=> update UserList set Password='abcdefgh' where ID = '00001';
UPDATE 1	# レスポンス

where句以下の条件を指定せずに実行すると、テーブル内のデータ全てが更新されるので一括更新がしたいときは楽。
ただし、一括更新するつもりがない時はwhere句の指定を忘れないよう注意が必要。


データの削除

既存のテーブルからデータを削除する時は
「delete from テーブル名 条件(where句)」
というSQL文で行う。

先程挿入したデータを削除する場合は下記のようにする。

Amethyst=> delete from UserList where ID = '00001';
DELETE 1	# レスポンス

where句以下の条件を指定せずに実行するとテーブル内のデータは綺麗さっぱりなくなってしまうので要注意。


テーブルの削除

既存のテーブルそのものを削除する時は
「drop table テーブル名」
というSQL文で行う。

先程作成したテーブル UserList を削除する場合は下記のようにする。

Amethyst=> drop table UserList;
DROP TABLE	# レスポンス

前項のdelete文で全てのデータを削除してもテーブル自体は残っているので、テーブルそのものを削除する時はこちらを使う。


データベースのバックアップ

データベースのバックアップを取るときは、シェル上で pg_dump コマンドを実行。

% pg_dump Amethyst > AmethystDB.bak
# "Amethyst"はデータベース名。"AmethystDB.bak"はバックアップファイル名

これで"AmethystDB.bak"という名前のバックアップファイルが作成される。
中身はSQL文とかが沢山書かれたテキストファイル。

バックアップファイルをもとにデータベースを再作成するときは psql コマンドに -e オプションをつけて実行する。

% psql -e Amethyst < AmethystDB.bak
# "Amethyst"はデータベース名。"AmethystDB.bak"はバックアップファイル名
関連するブログ記事
カテゴリー
PostgreSQL
タグ
PostgreSQL | RDBMS | SQL | コマンドライン | シェル

コメント(7)