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', 'マネージャー');テストデータはマイグレーションに含めません。テスト用データはテストコードで直接生成します。