PostgreSQL におけるデータ表(テーブル)の作成
テーブル(Table)の作成は、データベース管理において最も基礎的かつ核心的な操作です。これにはデータの構造(スキーマ)の定義、情報を格納するためのカラム(列)の指定、そして各カラムに最適なデータタイプ(データ型)の選定が含まれます。
適切に設計されたテーブル構造は、データの効率的な保存、検索、操作において極めて重要です。同時に、データベース全体のデータ整合性(Integrity)と一貫性を保証する役割も果たします。本章では、PostgreSQLでのテーブル作成方法をステップバイステップで解説し、カラムの定義や正しいデータ型の選択方法に焦点を当てます。
1. PostgreSQLにおけるテーブルの理解
PostgreSQLにおいて、テーブル(Table)とは行(Row)と列(Column)の形式で整理された関連データの集合体です。各行は個別のレコード(Record)を表し、各列はそのレコードの特定の属性(Attribute)を表します。
テーブルの構造は、Excelなどのスプレッドシート(Spreadsheet)をイメージすると分かりやすいでしょう。各行が1つのデータセットであり、各列がそのデータに関する具体的な情報項目です。実際にテーブルを作成する前に、以下のようなプランニングを行うことが非常に重要です。
- どのようなデータを保存するのか
- そのデータを表現するためにどのカラムが必要か
- 各カラムにどのデータ型を割り当てるべきか
例えば、図書館のデータベースを構築する場合、「books(書籍)」という名前のテーブルを作成するかもしれません。このテーブルには、タイトル (title)、著者 (author)、ISBN、出版日 (publication date)、ジャンル (genre) といった情報が含まれます。これらの各項目がテーブルのカラムになります。
2. CREATE TABLE 文
CREATE TABLE 文は、PostgreSQLで新しいテーブルを作成するために使用されます。基本的な構文は以下の通りです。
CREATE TABLE table_name (
column1_name data_type1,
column2_name data_type2,
column3_name data_type3,
...
);- CREATE TABLE: データベースに新しいテーブルを作成することを伝えるキーワードです。
- table_name: テーブルに付ける名前です。説明的であり、命名規則(例:小文字とアンダースコアの使用)に従うべきです。
- column1_name, column2_name...: テーブル内のカラム名です。
- data_type1, data_type2...: 各カラムに対応するデータ型です。そのカラムにどのような種類のデータ(整数、テキスト、日付など)を保存できるかを規定します。
実際の例として、従業員ID、名、姓、入社日を含む employees(従業員)テーブルを作成してみましょう。
CREATE TABLE employees (
employee_id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
hire_date DATE
);- employee_id: 各従業員のユニークな識別子を保存します。
SERIALはPostgreSQL特有のデータ型で、自動的に連番の整数を生成するため、プライマリキー(Primary Key)に最適です。PRIMARY KEY制約は、このカラムの値がユニークであり、かつ空(NULL)であってはならないことを保証します。 - first_name: 従業員の名を保存します。
VARCHAR(50)は可変長文字列を保存するデータ型で、ここでは最大50文字に制限しています。 - last_name: 従業員の姓を保存します。同じく
VARCHAR(50)を使用しています。 - hire_date: 従業員の入社日を保存します。
DATEは日付専用のデータ型です。
3. カラム(列)の定義
テーブル内の各カラムには、必ず名前とデータ型が必要です。カラムを定義する際は、以下の重要な要素を念頭に置いてください。
- カラム名 (Column Names): そのカラムの用途が明確に伝わる名前を選びます。慣習として小文字とアンダースコアで区切ります(例:
customer_id,product_name)。SQLの予約語をカラム名に使うことは避けてください。 - データ型 (Data Types): 保存するデータの種類に応じて適切な型を選択します。正しいデータ型はデータの整合性を保ち、ストレージ(保存容量)を最適化します。
- 制約 (Constraints): データの完全性ルールを強制するために制約を追加できます。
NOT NULL: カラムに空の値を許可しません。UNIQUE: カラム内のすべての値がユニークであることを保証します。PRIMARY KEY: テーブル内の各行を一意に識別します。FOREIGN KEY: 2つのテーブル間の関連(リレーション)を確立します。
4. PostgreSQLでよく使われるデータ型
PostgreSQLは、さまざまなデータを収容するために非常に豊富なデータ型を提供しています。以下は最も一般的に使用されるものです。
4.1 整数型 (Integer Types)
SMALLINT: 小さい範囲の整数(通常は -32,768 から 32,767)。INTEGERまたはINT: 標準的な整数(通常は -2,147,483,648 から 2,147,483,647)。BIGINT: 非常に広範囲の整数。SERIAL: 自動インクリメント(自増)される整数シーケンス。プライマリキーによく使われます。BIGSERIALはBIGINT版の自増型です。
例:
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
quantity_in_stock INTEGER
);(ここでは product_id がユニークなIDを自動生成し、quantity_in_stock が在庫数を整数で保存します。)
4.2 文字型 (Character Types)
VARCHAR(n): 最大長nの可変長文字列。TEXT: 長さ制限のない可変長文字列(非常に柔軟です)。CHAR(n): 固定長nの文字列。指定より短い文字列が入力された場合、残りはスペースで埋められます。
例:
CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50),
email TEXT
);(名前は VARCHAR(50) で長さを制限し、email は長さの変動が大きいため TEXT を使用しています。)
4.3 数値・浮動小数点型 (Numeric Types)
DECIMAL(p, s)またはNUMERIC(p, s): 正確な数値を保存します。pは全体の桁数、sは小数点以下の桁数です。精度が求められる財務データに最適です。REAL: 単精度浮動小数点数。DOUBLE PRECISION: 倍精度浮動小数点数。
例:
CREATE TABLE items (
item_id SERIAL PRIMARY KEY,
price DECIMAL(10, 2),
weight DOUBLE PRECISION
);(価格 price は最大10桁、うち小数点以下2位まで許可。重量 weight は倍精度浮動小数点数を使用。)
4.4 日付と時刻型 (Date and Time Types)
DATE: 日付のみ(年、月、日)。TIME: 時刻のみ(時、分、秒)。TIMESTAMP: 日付と時刻の両方。TIMESTAMP WITH TIME ZONE: タイムゾーン情報を含む日付と時刻。
例:
CREATE TABLE events (
event_id SERIAL PRIMARY KEY,
event_name VARCHAR(100),
event_date DATE,
event_time TIME,
event_timestamp TIMESTAMP WITH TIME ZONE
);4.5 論理値型 (Boolean Type)
BOOLEAN: 論理値(trueまたはfalse)。
例:
CREATE TABLE tasks (
task_id SERIAL PRIMARY KEY,
task_name VARCHAR(100),
is_completed BOOLEAN
);(is_completed でタスクが完了したかどうかをマークします。)
その他のデータ型: PostgreSQLは他にも JSON, JSONB, UUID, 配列 (Arrays)、幾何型などの高度なデータ構造をサポートしており、複雑なデータの処理に非常に強力です。
5. テーブル作成の総合例
異なるデータ型と制約条件を組み合わせた、より実践的なテーブル作成のケーススタディを見てみましょう。
例 1:customers(顧客)テーブルの作成
CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY, -- 自動生成されるユニークな主キー
first_name VARCHAR(50) NOT NULL, -- 名(NULL不可)
last_name VARCHAR(50) NOT NULL, -- 姓(NULL不可)
email VARCHAR(100) UNIQUE, -- メールアドレス(ユニーク制約)
phone_number VARCHAR(20), -- 電話番号
address TEXT, -- 住所詳細
registration_date DATE -- 登録日
);例 2:orders(注文)テーブルの作成
CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,
customer_id INTEGER REFERENCES customers(customer_id), -- 外部キー:顧客テーブルに関連付け
order_date TIMESTAMP WITH TIME ZONE, -- 注文日時(タイムゾーンあり)
total_amount DECIMAL(10, 2), -- 注文合計金額
shipping_address TEXT -- 配送先住所
);(REFERENCES customers(customer_id) は外部キー(Foreign Key)制約を確立し、この注文がどの顧客に属しているかを示します。)
例 3:products(製品)テーブルの作成
CREATE TABLE products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
description TEXT,
price DECIMAL(10, 2) NOT NULL,
category VARCHAR(50),
is_available BOOLEAN DEFAULT TRUE -- 在庫あり/なし、デフォルトは true
);(DEFAULT TRUE は、データを挿入する際に値が指定されない場合、自動的に真として扱うことを意味します。)