リレーショナルデータベースのテーブルは、紙に書く表によく似ています。 テーブルは行と列からできています。 列の数と順序は固定されており、それぞれの列に名前が付けられています。 行の数は可変です。 つまり行の数とは、その時点でどれだけのデータが格納されているのかを示すものです。 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ではありません。)
既に存在するテーブルを変更する方法については、本章で後述する5.6を参照してください。
これまでに説明したツールを使用して、十分に機能するテーブルを作成できます。 本章の残りでは、テーブル定義に機能を追加して、データの整合性、安全性、利便性を確実にする方法について述べていきます。 この時点でテーブルにデータを入力したければ、本章の残りを後回しにして第6章に進んでも構いません。