Skip to content

7.3. DDL作成標準

7.3.1. CREATE TABLE

sql
-- V1__create_users_table.sql
CREATE TABLE users (
    id          BIGSERIAL PRIMARY KEY,
    name        VARCHAR(100) NOT NULL,
    email       VARCHAR(255) NOT NULL,
    password    VARCHAR(255) NOT NULL,
    is_active   BOOLEAN NOT NULL DEFAULT true,
    created_at  TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now(),
    updated_at  TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT now()
);

CREATE UNIQUE INDEX uniq_users_email ON users (email);

作成規則:

  • カラム定義はインデントを揃えます。
  • NOT NULL制約を明示的に宣言します。nullableなカラムは意図的な場合にのみ許可します。
  • デフォルト値があるカラムはDEFAULTを併せて宣言します。
  • インデックスは同一マイグレーションファイルに含めます。

7.3.2. ALTER TABLE

sql
-- V3__add_phone_to_users.sql
ALTER TABLE users
    ADD COLUMN phone VARCHAR(20);
sql
-- V4__add_not_null_constraint_to_phone.sql
UPDATE users SET phone = '' WHERE phone IS NULL;

ALTER TABLE users
    ALTER COLUMN phone SET NOT NULL;

注意

NOT NULL制約を追加する際は、既存データのNULL値を先に処理しなければなりません。

7.3.3. インデックス作成

sql
-- V5__create_idx_orders_user_id.sql
CREATE INDEX idx_orders_user_id ON orders (user_id);

CREATE INDEX CONCURRENTLY idx_orders_created_at
    ON orders (created_at);
  • プロダクション環境で大容量テーブルにインデックスを追加する際はCONCURRENTLYオプションを使用します。

注意

CREATE INDEX CONCURRENTLYはトランザクション内部では実行できません。Flywayマイグレーションでこの構文を使用するには、別途のマイグレーションファイルに分離しなければなりません。

7.3.4. シードデータ

初期データ(ロール、コードなど)はマイグレーションファイルで管理します。

sql
-- V6__insert_initial_roles.sql
INSERT INTO roles (name, description) VALUES
    ('ADMIN', 'システム管理者'),
    ('USER', '一般ユーザー'),
    ('MANAGER', 'マネージャー');

テストデータはマイグレーションに含めません。テスト用データはテストコードで直接生成します。

TIENIPIA QUALIFIED STANDARD