SQL構文(DDL):スキーマ/データベース
スキーマ
スキーマの作成
CREATE SCHEMA schema_name [ AUTHORIZATION owner ];
デフォルトでは作成ユーザーがスキーマの所有者となりますが、[ AUTHORIZATION owner ]を使用する事で、他のユーザーを所有者に指定する事ができます。
但し、スキーマ内のオブジェクトを操作するには、スキーマ作成ユーザーも含め、「seach_path」の設定で、作成したスキーマを指定する必要があります。
postgres=# CREATE SCHEMA schema_a AUTHORIZATION user_a;
スキーマの優先使用順位の設定
SET search_path TO schema1, schema2, ...;
「search_path」を設定してSQLが参照するスキーマの優先順位を設定します。
SET search_path TO my_schema, public;
上記の設定では、まずmy_schema内に指定したオブジェクトが存在するか確認され、存在しない場合はpublicスキーマが参照されます。
スキーマ優先使用順位のリセット
RESET search_path;
search_pathの設定をデフォルトの状態(通常は”$user”, public)に戻します。
スキーマの削除
DROP SCHEMA [ IF EXISTS ] schema_name [, ...] [ CASCADE | RESTRICT ];
- IF EXISTS:指定したスキーマが存在している場合にのみ、スキーマを削除します。
- CASCADE:依存するオブジェクトも一緒に削除します。
- RESTRICT:依存するオブジェクトがある場合、削除を拒否します。
postgres=# DROP SCHEMA IF EXISTS schema_a CASCADE;
「CASCADE」を使用すると、スキーマ内のすべてのデータやオブジェクトが削除されるため、慎重に使う必要があります。
データベース
データベースの作成
CREATE DATABASE database_name
[ WITH ]
[ OWNER = user_name ]
[ TEMPLATE = template_name ]
[ ENCODING = encoding ]
[ LC_COLLATE = collate ]
[ LC_CTYPE = ctype ]
[ TABLESPACE = tablespace_name ]
[ CONNECTION LIMIT = max_connections ]
[ ALLOW_CONNECTIONS = boolean ];
- OWNER: データベースの所有者を指定します。
- TEMPLATE: 新規にデータベースを作成する際に、元となるテンプレートを指定します。デフォルトではtemplate1が使用されます。テンプレートデータベースには、デフォルトのオブジェクトが含まれており、 新しいデータベースはこれらのオブジェクトをコピーして作成されます。
- ENCODING: 文字エンコーディングを指定します。デフォルトでは、テンプレートデータベースのエンコーディングが使用されます。
- LC_COLLATE, LC_CTYPE: 文字列の並び順(ソート順)を決定するためのロケール設定を指定します。データベース内でのテキストデータの並び替えや比較の順序を決定する際に、この設定されたロケールが使用されます。
ロケール:言語や地域に特有の文字列処理や日付、数値のフォーマットルールです。
en_US.UTF-8:英語(アメリカ)の設定で、UTF-8エンコーディングを使用します。
ja_JP.UTF-8:日本語(日本)の設定で、UTF-8エンコーディングを使用します。 - TABLESPACE: データベースオブジェクト(テーブル、インデックスなど)が物理的に保存される場所を指定するための、論理的なストレージ領域を指定します。デフォルト以外の複数のテーブルスペースを作成することで、データを異なる物理ディスクやファイルシステムに分散して保存することが可能になり、パフォーマンスの向上に繋がります。
- ALLOW_CONNECTIONS: 接続を許可するか、しないかの指定です。
true:許可(デフォルト)
false:禁止
CREATE DATABASE database_a WITH OWNER = user_a TEMPLATE = template0;
データベースの削除
DROP DATABASE [IF EXISTS] database_name [WITH (FORCE)];
- IF EXISTS:指定されたデータベースが存在する場合にのみ削除を実行します。データベースが存在しない場合はエラーを発生させず、警告を出力します。
- WITH(FORCE):強制的にデータベースを削除します。
DROP DATABASE my_database;