SQL CREATE TABLEとデータ型・制約
SQL CREATE TABLEの構文を学びます。主要なデータ型、PRIMARY KEY、FOREIGN KEY、NOT NULL、デフォルト値、CHECK制約によるスキーマ設計を解説します。
DDL
詳細な説明
SQL CREATE TABLEとデータ型・制約
CREATE TABLE 文は、カラム、データ型、データの整合性を保証する制約を含む新しいテーブルの構造を定義します。
基本構文
CREATE TABLE employees (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
department VARCHAR(50) DEFAULT 'Unassigned',
salary DECIMAL(10, 2) CHECK (salary >= 0),
hire_date DATE NOT NULL DEFAULT CURRENT_DATE,
manager_id INTEGER REFERENCES employees(id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
主要なデータ型
| 型 | 用途 |
|---|---|
| INTEGER / BIGINT | 整数、ID |
| DECIMAL(p,s) | 正確な数値(金額など) |
| VARCHAR(n) | 可変長文字列 |
| TEXT | 無制限長の文字列 |
| BOOLEAN | 真偽値 |
| DATE / TIMESTAMP | 日付と時刻 |
| UUID | ユニバーサル一意識別子 |
| JSONB | 半構造化データ(PostgreSQL) |
インライン制約とテーブルレベル制約
CREATE TABLE order_items (
id SERIAL PRIMARY KEY,
order_id INTEGER NOT NULL,
product_id INTEGER NOT NULL,
quantity INTEGER NOT NULL CHECK (quantity > 0),
price DECIMAL(10, 2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id),
UNIQUE (order_id, product_id)
);
一時テーブル
CREATE TEMPORARY TABLE temp_results AS
SELECT * FROM large_table WHERE condition = true;
ベストプラクティス
- 必ずPRIMARY KEYを定義する(シンプルさのためにサロゲートキーを推奨)
- カラムが本当に欠損値を許容する場合を除き、NOT NULLを使用する
- ストレージの節約とパフォーマンス向上のため、適切な最小のデータ型を選択する
- 金額データにはDECIMALを使用する(FLOATやDOUBLEは使用しない)
- ビジネスルールをデータベースレベルで強制するためにCHECK制約を追加する
- 参照整合性を維持するために外部キーを定義する
- デバッグやマイグレーション管理を容易にするため、制約に明示的な名前を付ける
適切に設計されたCREATE TABLE文は、信頼性の高いパフォーマンスの良いデータベーススキーマの基盤です。
ユースケース
開発チームが新しいSaaSアプリケーションのデータベーススキーマを設計し、適切なデータ型、外部キー関係、ビジネスルールを強制するチェック制約を持つテーブルを定義する場面。