PostgreSQL リファレンス
PostgreSQL は、リレーショナル(関係)データベース管理システム (RDBMS:relational database management system) です。
SQL 言語を使用してデータベースおよびテーブルなどを作成しデータを記録することができます。
デーモン機能を使ってデータベースサーバーとすることも、単独でデータベースとしても利用できます。
PostgreSQL のユーザー管理は、ユーザーではなくロールで行います。PostgreSQL には、データベースごとにロールを分けることができないという特徴があります。
PostgreSQL ではロールはシステム内で統一されて管理されます。そのため、異なる会社やサイトといった複数の異なるデータベースの管理ユーザーを混在させるような使用方法には向いていません。
例えば、複数の会社(管理ユーザーが異なる場合)を1つのサーバーで管理するのではなく、会社(管理ユーザー)ごとにサーバーを構築する必要があります。
PostgreSQL のインストール
ここでは Ubuntu における PostgreSQL のインストールからユーザーの設定、PostgreSQL へのログインについて簡単に解説します。
インストールには Ubuntu や CentOS などのディストリビューションからインストールする方法と、PostgreSQL のサイトからソースをダウンロードしインストールする方法があります。
開発環境をディストリビューションを利用して構築するのなら、PostgreSQL もディストリビューションを利用してインストールすることをお勧めします。
PostgreSQLのインストール
管理者権限で、aptによってインストールします。
$ sudo apt install postgresql
インストールしただけの状態で公のサーバーとして利用するなら問題があります。スーパーユーザーの設定、アクセスログの記録などのセキュリティー設定や記録ディレクトリの設定などが必要になります。
初期のスーパーユーザーはpostgres
になっています。さらにパスワードを設定しなければなりません。
詳しくは初期状態での
を参照して下さい。postgres
ユーザーによるログイン
PostgreSQLの開発環境のインストール
もし開発環境を構築する必要がある場合には、上記の方法では開発用パッケージは含まれていません。PostgreSQL を使って開発を行うにはpostgresql-server-dev-all, libpq-devパッケージもインストールする必要があります。
$ sudo apt install postgresql-10 postgresql-server-dev-10 libpq-dev
詳しくはPostgreSQLのインストールについてを参照してください。
PostgreSQL サーバーの自動起動
PostgreSQL ではインストールするだけでサーバーとして自動で起動するようになっています。
起動しているかを確認するには systemctl コマンドのオプション status を使用します。
$ systemctl status postgresql ● postgresql.service - PostgreSQL RDBMS Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor pr> Active: active (exited) since Wed 2023-09-13 07:44:13 JST; 13min ago Process: 1413 ExecStart=/bin/true (code=exited, status=0/SUCCESS) Main PID: 1413 (code=exited, status=0/SUCCESS) CPU: 1ms 9月 13 07:44:13 user-PC systemd[1]: Starting PostgreSQL RDBMS... 9月 13 07:44:13 user-PC systemd[1]: Finished PostgreSQL RDBMS.
上記のように、PostgreSQL サーバーがactive
になっていればログインが可能になります。
PostgreSQL を起動するためには systemctl コマンドのオプション start を使用します。
$ sudo systemctl start postgresql
サーバーの起動、再起動に関しては起動設定
を参照してください。
上記のように自動で起動される PostgreSQL サーバーはデータベース・クラスタとも呼ばれます。データベース・クラスタは複数を作成することができ、多くの場合は OS のユーザーと関連付けれた名称になっています。ここでは postgresql という名称になっています。
データベース・クラスタについて詳しくは複数のデータベース・クラスタ(データベース・インスタンス)
を参照してください。
PostgreSQLの操作( psql )
psql は端末から利用できる PostgreSQL 用のインターフェイスです。
OS の端末から psql コマンド
でPostgreSQLのコマンドラインインターフェイスにログインします。
psql コマンドでデータベース名を指定しない場合はユーザー名と同じデータベース名に接続されます。
詳しくはpsql
を参照して下さい。
初期状態ではpostgres
で PostgreSQL のコマンドラインインターフェイスにログインしてみると思います。
しかし、初期状態のpostgres
ユーザーは Ubuntu においてはパスワードが設定されていません。
詳しくは初期状態での
を参照して下さい。postgres
ユーザーによるログイン
PostgreSQL からログアウトする場合は以下のコマンドです。
ユーザー(ロール)の管理
ロールについて
PostgreSQLでは、ユーザーはロールとして管理します。データベースへのログインや操作権限はロールで管理されます。
PostgreSQLへのログインや操作権限はユーザーごとに管理するのではなく、ロールごとに管理します。ロールにロールを登録することでグループとして管理することもできます。
ロールはデータベース・クラスタ(インスタンス)ごとに管理されます。データベースごとには管理ができないので注意してください。
ロールの作成と設定は以下の手順で行います。
ロールの管理はスーパーユーザーかロールの追加権限のあるユーザーで行います。
初期状態では「postgres」ユーザーがスーパーユーザーです。
(「postgres」というユーザー名は知られている名称ですので公のサーバーでの使用は好ましくありません。
ただし、予め postgres ユーザーの代替えユーザーを設定しておかない限りは、postgres ユーザーはサーバーの起動で使用しますので OS 上から削除するのは後々不具合が起こることがあります。
postgres をそのまま使用する場合には、パスワードの設定や外部から postgres でログインできないようにするといった対処が必要でしょう。)
ロールの一覧
psqlにログインし、\duコマンドを実行します。
テーブルごとのロール設定
テーブルごとのロールの設定を確認することができます。\dpコマンドでテーブルを指定します。
詳しくは「PostgreSQLユーザー(ロール)管理」を参照してください。
外部からPostgreSQLのデータ操作をするには、PostgreSQLへのログイン認証、ロールの設定、テーブルごとのロール設定が必要になります。
ログイン認証、ロールの設定、テーブルごとの設定については「ログイン認証とロールの設定」を参照して下さい。
スーパーユーザーまたはデータベース・クラスタ(インスタンス)を追加した場合は、 Peer 認証を設定しないと PostgreSQL にアクセスできません。
ローカルで PostgreSQL へのアクセスにおいて、ver 8.1 より後では OS のユーザーと PostgreSQL でのロールは一致していません。ローカルでのデータベースへのアクセスには Peer 認証を設定する必要があるかもしれません。
ロールとデータベース・クラスタ
ロールはデータベース・クラスタ(インスタンス)ごとに管理することができます。
データベース・クラスタごとにロールを管理することができるため、1つのサーバーで事業所や個人ごとにデータベースを作成するといったユーザーのグループを分けたいときにはデータベース・クラスタを利用します。
ログイン認証
ロールを追加しても PostgreSQL にログインできない場合があります。
例えば以下のような場合です。
上記のエラーは、ユーザーの認証設定ファイル pg_hba.conf や pg_ident.conf にユーザーと認証方法が設定されていないために起きます。
OS の端末から PostgreSQL にアクセスす場合には pg_hba.conf に以下のような peer 接続の許可を設定します。
パスワードによる認証が必要な場合は peer の部分にmd5
やpassword
などを指定します。
詳しくはログイン認証とロール
ページを参照してください。
データベースの管理(確認、作成、接続、削除)
データベースの管理としては主に既存データベースの一覧で確認、データベースの作成、削除、オーナー管理、ディレクトリ管理があります。ここでは簡単に説明します。
詳しくは、データベースの管理(一覧、作成、接続、削除)を参照して下さい。
データベースの一覧確認
$ psql -l
データベースの作成
まず最初にデータを統括するためのデータベースを作成しなければなりません。データベースにデータを収めるためのテーブルやビュー、トリガといったスクリプトなどが入ります。
# CREATE DATABASE new_database OWNER owner_name;
ログイン可能なユーザーを追加し、そのユーザーでpsql
コマンドを実行するとデータベースがないというエラーが返ってくることがあります。
そのような場合は、ユーザー名のデータベースを作ります。
# CREATE DATABASE user_name OWNER user_name;
詳しくは「データベースの管理(一覧、作成、接続、削除)」を参照してください。
データベースはデータベース管理システムによって統括して管理されています。
データベース管理システムの中にデータ・クラスタがあり、データベース・クラスタは複数のデータベースを管理しています。
データベース・クラスタについてはデータベース・クラスタ(データベース・インスタンス)
を参照してみてください。
テーブル定義
テーブルとは、データベースにおいてデータを格納するために用意する表のようなものです。
テーブルの作成
テーブルの作成は以下のように CREATE TABLE クエリーで定義します。
表計算のような行列の概念があり、CREATE TABLE
では列の各カラム(項目)の定義をします。
データ型には主に以下のものがあります。
データ型
PostgreSQL で扱うデータ型には主に文字列型、数値型、日時型があります。データ型はカラムのデータタイプ定義にも利用します。
文字列型
CHAR() も VARCHAR() も指定文字数を超えて入力しようとするとエラーになります。
タイプ名 | 概要 |
---|---|
CHAR() | 固定長。10,485,760 文字まで。指定数に満たない文は空白で埋められる。別名に character(n) がある。 |
VARCHAR() | 可変長。10,485,760 文字まで。指定数に収まるように保存領域が変化する。別名に character varying() がある |
TEXT | 1G 分の文字まで |
文字数が決まっているような場合は CHAR() または VARCHAR()を。10,485,760 文字を超えるような場合や文字数が決まっていない場合は TEXT を使用するとよいでしょう。
CHAR() は固定長で指定された文字数の容量を確保します。もしも指定文字数に満たない場合は空白で埋めます。
VARCHAR() は可変長で保存される文字数によって確保される容量が変わります。保存領域を無駄にしたくない場合は VARCHAR() を使用した方がよいでしょう。
入力時に文字列を扱うには引用符'
または"
で囲みます。
数値型
数値を表すには以下のようなデータタイプを使用します。
浮動小数点には DECIMAL や NUMERIC を使う必要があります。DECIMAL や NUMERIC は別名で NUMERIC の方が多く使用されるようです。
タイプ名 | 概要 |
---|---|
SMALLINT | SIGNED、-32,768 〜 32767 |
INT, INTEGER | SIGNED、-2,147,483,648 〜 2,147,483,647 |
BIGINT | SIGNED、-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807 |
DECIMAL | 整数は 131,072 桁、小数点以降は 16,383 桁 |
NUMERIC | 整数は 131,072 桁、小数点以降は 16,383 桁 |
REAL | 可変精度。6 桁精度 |
DOUBLE PRECISION | 可変精度。15 桁精度 |
連番型 | |
SMALLSERIAL | 自動増分。1 ~ 32,767 |
SERIAL | 自動増分。1 ~ 2,147,483,647 |
BIGSERIAL | 自動増分。1 ~ 9,223,372,036,854,775,807 |
整数の場合は、INT を使用するようにします。メモリに制限がある場合は SMALLINT。INT ではまかえない場合は BIGINT を使用します。
小数点以下が必要で、金額といった正確性を求められる場合は浮動小数点が扱える NUMERIC を使用します。DECIMAL や NUMERIC は別名です。
REAL や DOUBLE PRECISION も浮動小数点が扱えますが丸込みが起きるために不正確です。
日時型
日付や時刻には DATE や TIMESTAMP、TIME といったデータ型が用意されています。
タイプ名 | 概要 |
---|---|
DATE | YYYY-MM-DD。4713 BC 〜 5874897 AD |
TIME [ WITHOUT TIME ZONE ] | HH:MI:SS。00:00:00 〜 24:00:00 |
TIME WITH TIME ZONE | HH:MI:SS。時間帯指定あり。00:00:00+1459 〜 24:00:00-1459 |
TIMESTAMP [ WITHOUT TIME ZONE ] | YYYY-MM-DD HH:MI:SS。4713 BC 〜 294276 AD |
TIMESTAMP WITH TIME ZONE | YYYY-MM-DD HH:MI:SS。時間帯指定あり。4713 BC 〜 294276 AD |
INTERVAL | 時間間隔。1μ秒単位。-178,000,000 年 〜 178,000,000 年 |
テーブル一覧
テーブル一覧は \dt コマンドを使用します。
テーブルの内容確認
テーブルの内容確認は \dt コマンドでテーブル名を指定します。
テーブルの操作に関して詳しくはテーブル
を参照してください。
SQLファイルの読み込み
SQLファイルを、PostgreSQLのコマンドラインインターフェイスから読み込み、実行することができます。
database=> \i DataBase/sql_file.sql
読み込むsqlファイルはカレントディレクトリからファイル名で辿ります。読み込み先のデータベース名は確認するようにします。
詳しくはSQLファイルの読み込みと実行
を参照してください。
PostgreSQLの自動起動(デーモンプロセス設定)
Ubuntu のパッケージから PostgreSQL をインストールしたら、標準ではコンピュータの起動時に PostgreSQL も起動します。
もしも PostgreSQL を自動で起動しないように設定するには、 PostgreSQL の自動起動(デーモンプロセス設定)
を参照してください。
データのエクスポートとインポート
psqlコマンドプロントで利用する\COPYコマンドを使う方法があります。
\COPYコマンドによってPostgreSQLデータベースのテーブルレコードの出力と取り込みをすることができます。
詳しくはデータのエクスポートとインポートについてを参照してください。
その他
PostgreSQL を運用する上での Tips です。
- 日本語のソート
- 日本語をソートすると上手くいかない場合があります。多くの場合、LC_COLLATE の設定が英語になっています。その場合のソートの文字列の指定方法などについてです。