システム運用管理者の徒然日記

日々勉強、日々仲間に助けられ、何とか過ごしております。

日々勉強、日々仲間に助けられ、何とか過ごしております。

PostgreSQL

PostgreSQL でテーブルの存在有無チェックの方法

パーティショニングを行っているテーブルで「子テーブルの存在チェックを行い、存在すれば処理を実施する」というを実現する方法です。

PostgreSQL のクエリ単体では処理分岐の実現は難しく、PHP で記述した形です。

ここでは「information_schema.tables」を用いて、対象の子テーブルのカラムなどの情報を取得し、情報があればテーブルが存在すると判断して処理を進めています。
明示していないですが、情報がなければテーブルは存在しないと判断し、処理は行いません。

$pdo = new PDO('pgsql:dbname=<DB名>;host=<IPアドレス>', port=<ポート番号>, 'ユーザー名', 'パスワード');

$sql  = "SELECT * FROM information_schema.tables WHERE table_name = <テーブル名>;";
$res = $pdo->query($sql);
## デバッグ確認用
#var_dump($res->rowCount());
$res = $res->rowCount();

if($res == 1){
    $ret = <対象処理>;
    $res = $pdo->query($ret);
}


PHPのエラーキャッチなどは上記には記載していないため、logging や catch (PDOException $e) などを利用して、エラーメッセージの出力を行い、異常終了時における対応判断が可能な情報を出力するようにしてください。



以上

PostgreSQLでのカラム追加

今あるテーブルにカラムを追加するクエリは以下の通り。
追加する列については、既にNULLの行が存在してしまうため、NOT-NULLの制約条件は付与できません。

=# ALTER TABLE <テーブル名> ADD COLUMN <カラム名> <定義>;

上記の処理は、テーブルの最終カラムの次に追加され、カラム位置の指定はできません。
カラム位置を指定したい場合は、新しいテーブルを作成して旧テーブルのデータをinsertする方法で処理します。

--- 元テーブルをリネーム
ALTER TABLE <テーブル名> RENAME TO <変更後のテーブル名>;

--- 新規カラムを追加したテーブルを作成
CREATE TABLE <新テーブル名>
    ( <カラムA>    <定義>,
     <カラムB>    <定義>,
     <カラムC>    <定義>,
     :
    PRIMARY KEY ・・・
);

--- 元テーブルから新テーブルにデータを移行
INSERT INTO <新テーブル名>
    ( <カラムA>, <カラムB>, <カラムC>, ・・・)
SELECT <カラムA>, <カラムB>, <カラムC>, ・・・
FROM <変更後のテーブル名>;

--- 元テーブルを削除
DROP TABLE <変更後のテーブル名>;


以上。 

PostgreSQLで文字列置換して更新する方法

以下のupdate分で、カラムに格納されている一部の文字列が置換されます。
指定文字列の置換であるため、文字列の全置換えにはならないです。

=# update <テーブル名> set <カラム名> = replace(<カラム名>, '<置換前の文字列>', '<置換後の文字列>'); 


where句を指定しないと全行総舐めするため、行数が多い場合は必ずwhereで処理する範囲を指定してupdateかけてください。



以上。
 

PostgreSQLで、タブ区切りのファイルを出力する方法

#  psql -U <ユーザ名> -d <DB名> -A -F $'¥t' -c "select * from <テーブル名>;" > <ファイル名>.txt

例)  psql -U user1 -d DB1 -A -F $’¥t’ -c “select * from data_table;” > data_table.txt


コマンドラインから直接DBを操作してtxtファイルを出力。
ファイル出力でパスを指定していなければ、ホームディレクトリ上に作成される。
(rootログインしているのであれば、/root 直下)

当該ファイルをPCに取り込んで、Excel にコピペするとフィルターとかかけられて便利です。


スポンサードリンク