PostgreSQL 6.? の使い方
2000-10-15 作成 福島
2001-05-31 更新 福島

・ユーザの追加

postgres をアクセスするユーザを作成

$ su
# useradd UserName
# grep UserName /etc/passwd
UserName:x:500:500::/home/UserName:/bin/bash              DB操作のチェックが終了したら
                                                             shell を /bin/false や /usr/bin/passwd に変更すること

・ユーザの追加と削除 (ユーザ:postgres で行う)

# su - postgres

ユーザの追加 (31バイトまで,[A-Za-z0-9_]+)
postgres$ createuser UserName
Enter user's postgres ID or RETURN to use unix user ID: 500 ->   UserNameの ID が 500 のままで OK なので [ENTER] で送る
Is user "UserName" allowed to create databases (y/n) y    ---------- DB作成権を与える
Is user "UserName" a superuser? (y/n) n           ------------------ 特権は与えない
createuser: UserName was successfully added

ユーザの削除
postgres$ destroyuser UserName
destroyuser: delete of user UserName was successful.

postgres$ exit
# exit
$


・DBの作成と削除 (各ユーザで行う) DB の作成 $ su # su - UserName UserName$ createdb DBName DBName 省略時はユーザIDがDB名になる DB の削除 $ su # su - UserName UserName$ destroydb DBName
・psql の操作 テーブルの作成 $ psql DBName DBName=> create table TableName (TermName text, TermValue int); データの挿入 DBName=> insert into TableName values ('Term1', 100) ; DBName=> insert into TableName values ('Term2', 150) ; DBName=> select * from TableName; TermName|TermValue --------+--------- Term1 | 100 Term2 | 150 (2 rows) 特定のデータに 10 を加算 (対象は TermValue) DBName=> update TableName set TermValue = TermValue +10 where TermName = 'Term1'; DBName=> select * from TableName; TermName|TermValue --------+--------- Term1 | 110 Term2 | 150 (2 rows) 全てのデータに 10 を加算 (対象は TermValue) DBName=> update TableName set TermValue = TermValue +10; DBName=> select * from TableName; TermName|TermValue --------+--------- Term1 | 120 Term2 | 160 (2 rows) 特定のデータを削除 DBName=> delete from TableName where TermName = 'Term1'; DBName=> select * from TableName; TermName|TermValue --------+--------- Term2 | 160 (1 rows) テーブルの削除 DBName=> drop table TableName; テーブルの内容をファイルに出力 (セパレータ=TAB(0x09), 改行=LF(0x0A)) DBName=> \copy TableName to CSV-PATH テーブルの内容をファイルから追加 (セパレータ=TAB(0x09), 改行=LF(0x0A)) DBName=> \copy TableName from CSV-PATH
アクセス権設定 DBName=> grant PermitList on TableName to public DBName=> revoke PermitList on TableName from public PermitList: select,insert,update,delete,rule,all ※ public は一般ユーザの意味 アクセス権の確認 DBName=> \z Database = DBName +-----------+--------------------------+ | Relation | Grant/Revoke Permissions | +-----------+--------------------------+ | TableName | {"=","foo=Permit"} | +-----------+--------------------------+ Permit: r select a insert w update/delete R rule ※ "=" は一般ユーザの意味 (右辺には何の権限もない)
PostgreSQLSQL92意味
charcharacter または char1バイト文字。マルチバイト文字は格納できない。1バイトを占有
char(n)character(n) または char(n)固定長文字列
4+n バイトを占有。
入力文字が指定桁に満たなければ空白文字で詰められる。
n は 4096 以下。
オーバー分は捨てられる。
varchar(n)character varying(n) または char varying(n) または varchar(n)可変長文字列
4+n バイトを占有
n は 4096 以下
オーバー分は捨てられる。
float4/8float(p)精度pの浮動小数点
float8double precision倍精度浮動小数点
float8real単精度浮動小数点
int4integer または int符号付き整数
int2smallint小桁符号付き整数
int4numeric(p,s)任意精度の 10 進数数値
int4decimal(p,s)任意精度の 10 進数数値
datedate年月日 '2001-01-01'
timetime (with timezone)時分秒 '20:30:10.555' (24 時間制)
timsetamptimestamp (with timezone)年月日時分秒
'1901-12-14 00:00:00' - '2038-01-19 23:59:59'
SQL92 とは実装が違う
timespaninterval時間間隔
PostgreSQLSQL3意味
boolbooleantrue/falseを示す
PostgreSQL意味使い方
box矩形左下と右上の点を指定
circle(x,y),<r> または x,y,r として指定
lseg直線[(x1,y1),(x2,y2)]
(x1,y1),(x2,y2)
x1,y1,x2,y2
(x1,y1,x2,y2)
のいずれか
path経路[(x1,y1),(x2,y2),..]
(x1,y1),(x2,y2),..
x1,y1,x2,y2,..
(x1,y1,x2,y2,..)
のいずれか
point(x,y)
x,y
のいずれか
polygon多角形(x1,y1),(x2,y2),..
x1,y1,x2,y2,..
(x1,y1,x2,y2,..)
のいずれか
text可変長テキストPostgreSQL では varchar では無く text を推奨
4+x バイトを占有
int88バイト整数contrib に添付。非サポートのプラットホームもある
datetime8バイト浮動小数点SQL92 の timestamp 型よりも高機能
timestamp型よりも広い範囲で精度が高い
・numeric,decimalは int4 で実装されているため、スケール s (少数部分の精度) は 0 のみ。  また、numeric と decimal は内部的に同一なので、精度 p も同じ。 ・SQL92 では、real は単精度浮動小数点と規定されているが、PostgreSQL では float8 として実装されている。 ・time with time zone は未サポート ・timestamp with time zone は未サポート ・bit, bit varying は未サポート ・national character (nchar) は未サポート ・1レコードの大きさは 8192 バイト未満 (カラムの合計) ・8192 バイト超のデータは large object 型を使う ・配列から条件を特定して要素を検索することはできない  ※update myarray set ar = '{10,11,12}' where myarray.ar[1] = 1;   は可能。
Perl からの呼び出し #!/usr/local/bin/perl user Pg ; $conn = Pg::connectdb("dbname=DBName") ; $rslt = $conn->exec("Query") ; if ($rslt->resultStatus ne PGRES_TUPLES_OK) { print "execute fail: $conn->errorMessage\n" ; exit ; } $n = $rslt->ntuples ; for ( $i = 0 ; $i < $n ; $i ++ ) { print $rslt->getvalue($i,N) ; print "\n" ; } print "--- $n selected ---\n" ; ※psql ではDB名を指定しない場合、ユーザ名と同じDB名が使用されるが、  perl(Pg.pm) では DBName を明示しなくてはいけない。 ※Queryはセミコロンを付けない。(psql の SQL コマンドとは違う) ※NQueryの項目の番号。  例:   "select a,b from tableZ"   の場合、   $rslt->getvalue($i,0) --- a を取得   $rslt->getvalue($i,1) --- b を取得   になる。