テーブルの作成(CREATE TABLE)

今回からはpsqlを利用して実際にSQLコマンドを発行していきます。

まずは、データの入れ物であるテーブルを作成します。

CREATE TABLEコマンド

テーブルの作成はCREATE TABLEコマンドで行います。

CREATE TABLEコマンドの基本構文
CREATE TABLE テーブル名 (列名 データ型 制約 [, 列名 データ型 制約 …] );
   :
[表制約]
※[]内の数は不定

()内は列名とデータ型、その列の制約で1セットとなり、定義する列の分だけ、カンマ(,)区切りで指定します。列名とデータ型の定義は必須であり、制約は必要に応じて任意に設定します。

列に指定する制約として以下の項目があります。

PRIMARY KEY 主キーとする。
UNIQUE 列内で重複する値を許可しない。
REFERENCES 表名(列名) 外部キーとする。参照先は指定した表名(列名)となる。
CHECK(条件) 条件に合う値のみ登録を許可する。
NOT NULL NULL値(空の値)を許可しない。
DEFAULT 値 新規行追加時の初期値を指定する。

上記は列ごとに制約を指定していますが、以下の制約については表全体の制約として指定することができます。

PRIMARY KEY(列名リスト) 指定した列(複合キーの場合は列1、列2…と列挙)を主キーとする。
UNIQUE(列名リスト) 指定した列内で重複する値を許可しない。
FOREIGN KEY(列名リスト) REFERENCES 表名(列名リスト) 指定した列(複数列を参照する場合は列1、列2…と列挙)を外部キーとする。参照先は指定した表名(列名)となる。

特に複数の列を使って主キーとする複合キーなどは、列ごとに設定することができないため、この表制約にて設定を行うことになります。

ここではサンプルとして以下の列を持つStaffテーブルを作成します。

列名 データ型 制約
id INTEGER PRIMARY KEY
name TEXT NOT NULL
age INTEGER なし

スタッフの名簿情報を格納するテーブルです。列には「id」「name」「age」を持ち、それぞれ、ID、名前、年齢を格納します。データ型はそれぞれ数字、文字列、数字とします。

また、各列の制約として、「id」にはPRIMARY KEY(主キー)制約を持たせます。PRIMARY KEY制約は、列内で重複する値の格納を許可せず、かつ、必ずデータを格納しなければならないという制約です。

「name」には必ずデータを格納しなければならないことを示すNOT NULL制約を持たせます。

では、実際にCREATE TABLEコマンドを発行してテーブルを作成してみましょう。今回発行するSQL文は以下になります。

CREATE TABLE Staff
(id    CHAR(4)    NOT NULL,
name   TEXT       NOT NULL,
age    INTEGER    ,
PRIMARY KEY (id));

まず、PostgreSQLに接続します。本サンプルでは接続先のデータベースとして「testdb」を指定しています。データベースの作成については「サンプルデータベースの作成」を参照してください。

# su - postgres
$ psql -U postgres testdb

「testdb」に接続できたら、上記のCREATE TABLEコマンドを発行し、Staffテーブルを作成します。SQL文は1行で実行しても構いませんが、見やすいよう以下のように複数行に分けて実行します。

testdb=# CREATE TABLE Staff
testdb-# (id    CHAR(4)    NOT NULL,
testdb(# name   TEXT       NOT NULL,
testdb(# age    INTEGER    ,
testdb(# PRIMARY KEY (id));

2行目以降は、プロンプトが「=#」から「-#」や「(#」に変わっていることに着目してください。これは、まだSQLが終わっていないことを示しており、セミコロンを入力し、Enterキーを押すことで、ここまでの入力した内容がひとつのSQL文として見なされ実行されます。

では、テーブルが作成されたかどうかをバックスラッシュコマンドで確認してみましょう。

testdb=# \d
              リレーションの一覧
 スキーマ |    名前     |    型    |  所有者
----------+-------------+----------+----------
 public   | staff       | テーブル | postgres
 public   | testTable01 | テーブル | postgres
(2 行)

Staffテーブルが一覧から確認できます。これでテーブルは作成されました。次回は今回作成したテーブルにデータを挿入するSQLについて見ていきます。