SAK 図書館
PostgreSQL 編4 - テーブル作成、制約、項目タイプ、キー作成、順序作成
■日本語問題 ・日本語 ODBC 経由のアクセスでは、項目名やデータとして日本語を使用する ことに何ら問題がない。これは、ECU_JP パラメタでコンフィグレーション をしたおかげと思う。 しかし、psql や ipgsql では、日本語がうまく扱えない。 テキストファイルからの実行等も行ったがダメである。 ECU コードで指定する必要があるのかと、日本語 EUC コードで、SQL のテ キストを作成し、「\i」で実行させたら、正常に日本語が処理できた。 但し、psql の select 表示は化ける。(^^; (Cygwin 2.05b と less290i.tgz で psql での select 日本語表示可能。) ■データベース作成 ・PATH の優先順位が MySQL の方が高かったため、create database でエラー が発生した。PostgreSQL への PATH が先に来るようにする。 ・データベースの作成は、次のようにする。 create user sak with password 'sak'; create database sak; ■テーブル作成 ・「\i sqlfile」で、テキストファイルに記述した SQL を処理できる。 また、クリップボードコピーでの流し込みでも処理できる。 create table testm ( key char(008) primary key, data1 int8, data2 int8, data3 int8 ); ・テーブル作成時に NOT NULL 制約、UNIQUE 制約、DEFAULT 初期値設定を 指定できる。 create table testm ( key char(008) primary key, data1 int8 not null, data2 int8 unique, data3 int8 default 0 not null ); ・constraint でプライマリキーを付けるには、次のようにする。 複合主キーは、これ以外の方法では付けられない。 (と思っていたら、付けられるらしい。バージョンによる?) create table testm ( key char(008), data1 int8, data2 int8, data3 int8, constraint KEY_NAME primary key ( key, data1 ) ); ・テーブル削除は、次のようにする。 drop table testm; ■項目タイプ(フィールドタイプ) ・PostgreSQL 項目型 smailint / int2 2 バイト整数 integer / int / int4 4 バイト整数 bigint / int8 8 バイト整数 decimal(a, a) / numeric(a, s) 10 進型 real / float4 6 桁単精度浮動小数点 double precision / float8 15 桁倍精度浮動小数点 serial 4 バイト順序 bigserial 8 バイト順序 date 日付 time 時間 timestamp 日付時間 char(文字数) / character 固定長文字列 (最大 4096 文字) varchar(文字数) / charcter varying 可変長文字列 (最大 4096 文字) text 無制限テキスト ラージオブジェクト oid 型 (いまいちわからん) (^^; boolean / bool true / false ■キー作成 ・単項目のキー設定は、テーブル作成時の create 文で行うと良い。 項目定義に primary key を指定するだけである。 key char(008) primary key, ・複合主キーについては、PostgreSQL では、テーブル作成後に別途 alter 文 で追加することはできない。 create tabel 時に constraint primary key で付加しておくこと。 (と思っていたら、付けられるらしい。バージョンによる?) create table testm ( key char(008), data1 int8, data2 int8, data3 int8, constraint KEY_NAME primary key ( key, data1 ) ); ・主キー以外にいくつでも副キー索引を作成できる。 create index で作成するが、ユニークでない重複キーも作れる。 頻繁に使われるクエリのキーは作成しておくと、レスポンスが著しく違う。 但し、あまりキー(索引) を作りすぎてもいけない。 更新時に索引の更新負荷が増大することになる。 従って、問い合わせクエリを意識した最小限で、かつ、高速アクセスとなる 索引を設計する。 また、where 句や order by 句にキーを含めて指定するようにする。 データベースの更新や問い合わせに異様に時間がかかるのは、キーの指定が されていないからである。 ・create tabble 時の primary key は、システムが自動的に索引を作成する ので、手作業で別途作成する必要はない。 それ以外の副キーは、次のように作成する。 unique 指定がなければ重複可となる。 create unique index KEY_NAME on testm ( key, data1 ); create index KEY_NAME on testm ( key, data1 ); ・索引の削除は、次のようにする。 drop index KEY_NAME; ■順序作成 ・順序は、serial と定義することで利用できる。 create table testm ( key char(008), data1 serial, data2 int8, data3 int8 ); insert into testm values('a001'); insert into testm values('b002'); key | data1 | data2 | data3 ----------+-------+-------+------- a001 | 1 | | b002 | 2 | | ・Oracle と同じ順序のように create sequence がある。 単純な順序は、次のように作成する。 create sequence seq; ・次のようにすると、10000 〜 9999900、増分 100 でくるくる回ります。 cache の省略値は不明。 create sequence seq increment 100 minvalue 10000 maxvalue 9999900 start 10000 cache 200 cycle ; ・順序の削除は、次のようにする。 drop sequence seq; ・実際に順序を利用するには、次のようにする。 nextval がシーケンス番号を生み出す。 尚、順序が rollback されず、飛ぶ可能性があるかは未検証。 currval は、前回と同じ順序を呼び出す。順序の現在値ではなく、 セッションユーザが最後に使用した値になるかは未検証。 insert into testm values ('s001', nextval('seq'), 20, 30); insert into testm values ('s002', nextval('seq'), 20, 30); insert into testm values ('s003', currval('seq'), 20, 30); key | data1 | data2 | data3 ----------+-------+-------+------- s001 | 10000 | 20 | 30 s002 | 10100 | 20 | 30 s003 | 10100 | 20 | 30 ■PostgreSQL 編、JAVA Servlet、JSP 編資料
■MySQL 編資料
■SQL 基礎編資料
■SQL 基礎実地編資料
■SQL チューニング編資料
■Oracle PL/SQL 編資料