Chapter 2. データ定義

Table of Contents
2.1. テーブルの基本
2.2. システム列
2.3. デフォルト値
2.4. 制約
2.4.1. 検査制約
2.4.2. NOT-NULL 制約
2.4.3. 一意性制約
2.4.4. プライマリキー
2.4.5. 外部キー
2.5. 継承
2.6. テーブルの変更
2.6.1. 列の追加
2.6.2. 列の削除
2.6.3. 制約の追加
2.6.4. 制約の削除
2.6.5. デフォルトの変更
2.6.6. 列名の変更
2.6.7. テーブル名の変更
2.7. 権限
2.8. スキーマ
2.8.1. スキーマの作成
2.8.2. public スキーマ
2.8.3. スキーマ検索パス
2.8.4. スキーマおよび権限
2.8.5. システムカタログスキーマ
2.8.6. 使用パターン
2.8.7. 移植性
2.9. その他のデータベースオブジェクト
2.10. 依存関係の追跡

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

2.1. テーブルの基本

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

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

PostgreSQL には、さまざまなアプリケーションに対応した多数のデータ型のセットが組み込まれています。 またユーザが独自のデータ型を定義することも可能です。 組み込みデータ型のほとんどには分かりやすい名前と意味が付けれられているので、ここでは詳しく説明しません。詳細については Chapter 5 を参照してください。 よく使用されるデータ型としては、整数を表す 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 です。 テーブル名および列名は、Section 1.1.1 で説明されている識別子の構文に従います。 通常、型名は同時に識別子でもありますが、例外もあります。 列リストはコンマで区切り、括弧で囲むことに注意してください。

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

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

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

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

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

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

DROP TABLE my_first_table;
DROP TABLE products;

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

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

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