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 編資料