./configure --enable-multibyteこの場合、そのままでは日本語等のマルチバイト文字は使用できないので
./configure --enable-multibyte=EUC_JP等として、日本語コードを設定する。
-E,--encoding=エンコーディング
-E,--encoding=エンコーディング
CREATE DATABASE dbanme WITH ENCODING = 'エンコーディング'; LOCATION を同時に指定する場合は以下のような感じ。 CREATE DATABASE dbanme WITH LOCATION = 'path' ENCODING = 'エンコーディング';
エンコーディング SQL_ASCII ASCII EUC_JP 日本語 EUC EUC_CN GB をベースにした中文EUC。code set 2 は SS2+2バイトコード = 3バイト表現です。 EUC_KR 韓国語 EUC。 EUC_TW 台湾の EUC。code set 2 は SS2+面番号+2バイトコード = 4バイト表現です。 UNICODE UTF-8。ただしサポートするのは UCS-2 の範囲、すなわち 0xffff までです。 MULE_INTERNAL mule の内部コード。ただし、Type N の不定長文字は サポートしていません。 LATIN* ISO8859 Latin シリーズ。* は 1 から 5 まで指定できます。 キリル文字 KOI8(KOI8-R), WIN(CP1251), ALT(CP866)をサポートしています。 もちろん ISO 8859-5 も使用可能です。 この場合、"LATIN5" として指定して下さい。
* tbl_name.get * \pset border 1 \pset format unaligned \pset tuples_only \dt ← テーブルのみ view,sequence等を含める場合は '\d'とするバックアップコマンドファイル
* tbl_backup * #!/bin/bash DB_HOST="db_host" DB_NAME="db_name" POSTGRES_HOME=/usr/local/pgsql # 指定されたDBのテーブル名を取得し ファイルに保存 cat tbl_name.get |$POSTGRES_HOME/bin/psql -q -h $DB_HOST $DB_NAME | cut -f1 -d "|" >tbl.lst # テーブル名が保存されたファイルからテーブル名を読み込み # pg_dumpコマンドでデータバックアップ for fname in $(cat tbl.lst); do echo $fname $POSTGRES_HOME/bin/pg_dump -h $DB_HOST -c -t $fname $DB_NAME > $fname.dat done exit 0
CREATE TABLE hoge_tbl (col1 text,col2 SERIAL) ;でテーブルを作成すると
CREATE TABLE "item_master" ( -- 商品マスター "code" int4, -- 商品コード "name" text, -- 商品名 "cnt" int4, -- 個数 "price" int4 -- 値段 ); CREATE TABLE "item_log" ( -- 履歴テーブル "act" text, -- 処理モード 追加/修正/削除 "old_code" int4, -- 旧商品コード "old_name" text, -- 旧商品名 "old_cnt" int4, -- 旧個数 "old_price" int4, -- 旧値段 "new_code" int4, -- 新商品コード "new_name" text, -- 新商品名 "new_cnt" int4, -- 新個数 "new_price" int4, -- 新値段 "up-date" timestamp DEFAULT 'now'::text -- 更新日 これがキモ ); -- データ追加時の rule CREATE RULE item_in AS ON INSERT TO item_master DO INSERT INTO item_log(act,new_code,new_name,new_cnt,new_price) VALUES('insert',new.code,new.name,new.cnt,new.price) ; -- データ更新時の rule CREATE RULE item_up AS ON UPDATE TO item_master DO INSERT INTO item_log(act,old_code,old_name,old_cnt,old_price,new_code,new_name,new_cnt,new_price) VALUES('update',old.code,old.name,old.cnt,old.price,new.code,new.name,new.cnt,new.price) ; -- データ削除時の rule CREATE RULE item_del AS ON DELETE TO item_master DO INSERT INTO item_log(act,old_code,old_name,old_cnt,old_price) VALUES('delete',old.code,old.name,old.cnt,old.price) ;これで "item_master"に対し 追加/更新/削除を行うとその履歴が "item_log"に記録される。
PostgrSQL V7.0.3の場合、更新日の項目はruleに記述しなくてもテーブルにDEFAULT値の設定があると自動的に追加される様です。 PostgrSQL V7.2.1の場合、は自動的に追加されません。 |
$ pg_dump test_db -t item_master \connect - postgres CREATE TABLE "item_master" ( "code" int4, "name" text, "cnt" int4, "price" int4 ); COPY "item_master" FROM stdin; \. CREATE RULE item_in AS ON INSERT TO item_master DO INSERT INTO item_log (modex, new_code, new_name, new_cnt, new_price, "up-date") VALUES ('insert'::text, new.code, new.name, new.cnt, new.price, "timestamp"('now'::text));
CREATE TABLE "item_log" ( -- 履歴テーブル "act" text, -- 処理モード 追加/修正/削除 : : "up-date" timestamp -- 更新日 ); CREATE RULE item_in AS ON INSERT TO item_master DO INSERT INTO item_log(act,new_code,new_name,new_cnt,new_price,up-date) VALUES('insert',new.code,new.name,new.cnt,new.price,'NOW') ; $ pg_dump test_db -t item_master \connect - postgres CREATE TABLE "item_master" ( "code" int4, "name" text, "cnt" int4, "price" int4 ); COPY "item_master" FROM stdin; \. CREATE RULE item_in AS ON INSERT TO item_master DO INSERT INTO item_log (modex, new_code, new_name, new_cnt, new_price, up-date) VALUES ('insert'::text, new.code, new.name, new.cnt, new.price, '2002-07-07 11:40:01+09'::"timestamp");
** シーラカンス本の改訂第3版では更新日にCURRENT_TIMESTAMPをruleのINSERT文のVALUESに設定していますがこの場合更新日は'current'(つまり常に現在)となる為、結局正しい更新日を得られません(と思う) |
CREATE TABLE "user_master" ( -- 顧客マスター "u_code" int4, -- 顧客コード "u_name" text, -- 顧客名 "sale" int4, -- 営業担当 "support" int4 -- サポート担当 ); CREATE TABLE "staff" ( -- スタッフマスター "s_code" int4, -- スタッフコード "s_name" text, -- スタッフ名 );
顧客マスター コード | 名称 | 営業 | サポート ────┼─────┼────┼──── 101 | A商事 | 301 | 305 102 | B企画 | 302 | 301 203 | D商事 | 303 | 561 | E商店 | 301 | 745 | G商事 | 304 | 302 844 | J企画 | 305 | スタッフマスター コード | 名前 ────┼───── 301 | 太郎 302 | 次郎 303 | 三郎 304 | 花子 305 | 好子
SELECT u.*,s1.s_name as s1_name ,s2.s_name as s2_name FROM user_master as u LEFT JOIN staff as s1 ON (u.sale = s1.s_code) LEFT JOIN staff as s2 ON (u.support = s2.s_code) ORDER by u_code ; u_code | u_name | sale | support | s1_name | s2_name --------+--------+------+---------+---------+--------- 101 | A商事 | 301 | 305 | 太郎 | 好子 102 | B企画 | 302 | 301 | 次郎 | 太郎 203 | D商事 | 303 | 0 | 三郎 | 561 | E商店 | 301 | 0 | 太郎 | 745 | G商事 | 304 | 302 | 花子 | 次郎 844 | J企画 | 305 | 0 | 好子 | (6 rows)
権限についてにあるようにSERIAL(シリアル型)の項目を含むテーブルを作成した場合、SERIALの項目用のシーケンステーブルが自動的に作成されます。 しかし、pg_dumpでSERIALの項目を含むテーブルをバックアップしてもシーケンステーブルは自動でバックアップはされません。 その為、SERIAL(シリアル型)の項目を含むテーブルのデータをバックアップから復旧した場合、以下の操作でSERIALの項目の整合性を取るか、明示的にシーケンステーブルをバックアップし データテーブルと同時に復旧する必要があります。 pg_dumpによるテーブルのバックアップを定期的に自動で行っているのであればシーケンステーブルもバックアップしておけば、復旧は楽かもしれません。 |
hoge_db=# CREATE TABLE hoge_tbl (col1 text,col2 SERIAL) ; hoge_db=# \d List of relations Name | Type | Owner -------------------+----------+---------- hoge_tbl | table | postgres hoge_tbl_col2_seq | sequence | postgres
$ pg_dump hoge_db -t hoge_tbl > hoge_tbl.dat : : $ psql -e hoge_db < hoge_tbl.dat $ psql hoge_db hoge_db=# select setval('hoge_tbl_col2_seq', (select max(col2) from hoge_tbl));