第 5章データ定義

目次
5.1. テーブルの基本
5.2. システム列
5.3. デフォルト値
5.4. 制約
5.4.1. 検査制約
5.4.2. 非NULL制約
5.4.3. 一意性制約
5.4.4. プライマリキー
5.4.5. 外部キー
5.5. 継承
5.6. テーブルの変更
5.6.1. 列の追加
5.6.2. 列の削除
5.6.3. 制約の追加
5.6.4. 制約の削除
5.6.5. デフォルトの変更
5.6.6. 列名の変更
5.6.7. テーブル名の変更
5.7. 権限
5.8. スキーマ
5.8.1. スキーマの作成
5.8.2. public スキーマ
5.8.3. スキーマ検索パス
5.8.4. スキーマおよび権限
5.8.5. システムカタログスキーマ
5.8.6. 使用パターン
5.8.7. 移植性
5.9. その他のデータベースオブジェクト
5.10. 依存関係の追跡

この章では、データを保持するためのデータベース構造を作成する方法を説明します。 リレーショナルデータベースでは生データはテーブルに格納されます。 したがって、この章ではテーブルの作成と変更の方法や、テーブルにどのようなデータを格納するかを制御するための機能について重点的に解説します。 さらに、テーブルをスキーマに編成する方法、および、テーブルへの権限の割り当てについても説明します。 そして最後に、ビュー、関数、および、トリガなど、データの格納に影響する機能について簡単に説明します。

5.1. テーブルの基本

リレーショナルデータベースのテーブルは、紙に書く表によく似ています。 テーブルは行と列からできています。 列の数と順序は固定されており、それぞれの列に名前が付けられています。 行の数は可変です。 つまり行の数とは、その時点でどれだけのデータが格納されているのかを示すものです。 SQLではテーブル内の行の順序は保証されません。 テーブルを読み込むと、明示的に並び替えが要求されない限り、行はランダムな順序で返されます。 これについては第7章を参照してください。 さらに、SQLでは行に固有の識別子が割り当てられないので、テーブル内にまったく同一の行がいくつも存在することが可能です。 これは、SQLの基礎をなす算術モデルの結果ですが、通常は好ましいことではありません。 この問題の対処法については、本章で後述します。

それぞれの列にデータ型があります。 データ型によって、列に割り当てられる値が制限されます。 また、列に格納されているデータに意味が割り当てられ、データを計算に使用できるようになります。 たとえば、数値型と宣言された列は任意のテキスト文字列は受け付けません。 そして、数値型の列に格納されているデータは算術計算に使用できます。 これに対して、文字列型と宣言された列はほとんどすべての種類のデータを受け付けます。 しかし、文字列の結合といった演算には使用できますが、算術計算には使用できません。

PostgreSQLには、様々なアプリケーションに対応した多数のデータ型の集合が組み込まれています。 またユーザが独自のデータ型を定義することも可能です。 組み込みデータ型のほとんどには分かりやすい名前と意味が付けれられているので、詳しく説明はここでは行なわず、第8章で行ないます。 よく使用されるデータ型としては、整数を表すinteger、小数も表すことができるnumeric、文字列を表すtext、日付を表すdate、時刻を表すtime、そして日付と時間の両方を含むtimestampがあります。

テーブルを作成するには、その名のとおりCREATE TABLEコマンドを使用します。 このコマンドで最低限指定する必要があるのは、新規テーブル名、列名、各列のデータ型です。 例を示します。

CREATE TABLE my_first_table (
    first_column text,
    second_column integer
);

これで2列からなるmy_first_tableという名前のテーブルが作成されます。 最初の列の名前はfirst_columnで、そのデータ型はtextです。 2番目の列の名前はsecond_columnで、そのデータ型はintegerです。 テーブル名および列名は、項4.1.1で説明した識別子の構文に従います。 通常、型名は識別子でもありますが、例外もあります。 列リストはコンマで区切り、括弧で囲むことに注意してください。

先ほどの例は、説明が目的であるため現実的ではありません。 通常、テーブルおよび列の名前は、どのようなデータが格納されているか分かるような名前にします。 以下に、より現実的な例を示します。

CREATE TABLE products (
    product_no integer,
    name text,
    price numeric
);

(numeric型は小数を格納することができ、金額を扱う場合はこれが一般的です。)

ティップ: 相関するテーブルを数多く作成する場合は、テーブルと列の名前を一貫させるのが賢明です。 たとえば、テーブル名に単数形あるいは複数形どちらの名詞を使用するかを選択します (これは論者によって好みが分かれています)。

テーブルに含めることができる列の数には制限があります。 制限は、列の型に応じて250〜1600の間となります。 しかし、これほど多くの列を使用することは稀ですし、そのような場合は設計に問題があることも多いのです。

必要のないテーブルができた場合は、DROP TABLEコマンドを使用してそのテーブルを削除できます。 例を示します。

DROP TABLE my_first_table;
DROP TABLE products;

存在しないテーブルを削除しようとすると、エラーになります。 もっとも、テーブルを作成する前に、エラーメッセージを無視して無条件に削除操作を行うことは、SQLスクリプトファイルではよく行われることです。

すでに存在するテーブルを変更する方法については、本章で後述する項5.6を参照してください。

これまでに説明したツールを使用して、十分に機能するテーブルを作成できます。 本章の残りでは、テーブル定義に機能を追加して、データの整合性、安全性、利便性を確実にする方法について述べていきます。 この時点でテーブルにデータを入力したければ、この章の残りを後回しにして第6章 に飛んでも構いません。