-- 361: quiz 세션 내 같은 문제 이중 attempt 방지 partial UNIQUE (R9). -- submit_attempt 의 FOR UPDATE 행잠금이 1차 방어, 이 제약은 DB 레벨 belt-and-suspenders. -- prod 실측 중복 0 (GROUP BY (quiz_session_id, study_question_id) HAVING count>1 = 0) + fresh DB -- 빈 테이블이라 dedup DELETE 불요 → ★single statement(init_db exec_driver_sql 은 multi-statement -- 불허). 혹시 중복이 생긴 환경이면 이 마이그가 실패하므로(IntegrityError) 수동 dedup 후 재적용. -- quiz_session_id IS NULL(세션 외 직접 입력)은 비대상 → partial index. CREATE UNIQUE INDEX IF NOT EXISTS uq_attempt_session_question ON study_question_attempts (quiz_session_id, study_question_id) WHERE quiz_session_id IS NOT NULL;