-- Migration 012: Unique constraint on (profile_id, date, focus) -- v9d Phase 2a: Prevent duplicate rest day types per date -- Date: 2026-03-22 -- Add focus column (extracted from rest_config for performance + constraints) ALTER TABLE rest_days ADD COLUMN IF NOT EXISTS focus VARCHAR(20); -- Populate from existing JSONB data UPDATE rest_days SET focus = rest_config->>'focus' WHERE focus IS NULL; -- Make NOT NULL (safe because we just populated all rows) ALTER TABLE rest_days ALTER COLUMN focus SET NOT NULL; -- Add CHECK constraint for valid focus values ALTER TABLE rest_days ADD CONSTRAINT valid_focus CHECK ( focus IN ('muscle_recovery', 'cardio_recovery', 'mental_rest', 'deload', 'injury') ); -- Add UNIQUE constraint: Same profile + date + focus = duplicate ALTER TABLE rest_days ADD CONSTRAINT unique_rest_day_per_focus UNIQUE (profile_id, date, focus); -- Add index for efficient queries by focus CREATE INDEX IF NOT EXISTS idx_rest_days_focus ON rest_days(focus); -- Comment for documentation COMMENT ON COLUMN rest_days.focus IS 'Extracted from rest_config.focus for performance and constraints. Prevents duplicate rest day types per date.';