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スクリプトファイルではよく行われることです。 (この操作を行いたければ、エラーメッセージの出力を防ぐDROP TABLE IF EXISTSという亜種を使用することができます。 しかし、これは標準SQLではありません。)

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