PostgreSQL 入門

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: 自動インクリメント(自増)される整数シーケンス。プライマリキーによく使われます。BIGSERIALBIGINT 版の自増型です。

例:

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 は、データを挿入する際に値が指定されない場合、自動的に真として扱うことを意味します。)