| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- -- DDL 006: UNIQUE 제약조건 근본적 수정
- -- 생성일: 2024-12-20
- -- 목적: 중복 키 오류 근본 해결을 위한 UNIQUE 제약조건 수정
- -- 1. 기존 UNIQUE 제약조건 제거
- ALTER TABLE `VENDOR_INFLUENCER_MAPPING`
- DROP INDEX `unique_vendor_influencer_status`;
- -- 2. 새로운 UNIQUE 제약조건 추가 (IS_ACT='Y'인 레코드만 적용)
- -- MySQL 8.0+에서는 함수 기반 인덱스 지원
- -- 아래 방식은 MySQL 5.7에서도 호환 가능한 방식
- -- 방법 A: 조건부 UNIQUE 인덱스 (MySQL 8.0+)
- -- ALTER TABLE `VENDOR_INFLUENCER_MAPPING`
- -- ADD UNIQUE INDEX `unique_active_vendor_influencer_status`
- -- (`VENDOR_SEQ`, `INFLUENCER_SEQ`, `STATUS`)
- -- WHERE `IS_ACT` = 'Y';
- -- 방법 B: 가상 컬럼을 이용한 UNIQUE 제약조건 (MySQL 5.7+ 호환)
- -- 1) 가상 컬럼 추가 (IS_ACT가 'Y'일 때만 값을 가짐)
- ALTER TABLE `VENDOR_INFLUENCER_MAPPING`
- ADD COLUMN `UNIQUE_KEY_HELPER` VARCHAR(50)
- GENERATED ALWAYS AS (
- CASE
- WHEN `IS_ACT` = 'Y' THEN CONCAT(`VENDOR_SEQ`, '-', `INFLUENCER_SEQ`, '-', `STATUS`)
- ELSE NULL
- END
- ) STORED;
- -- 2) 가상 컬럼에 UNIQUE 인덱스 적용
- ALTER TABLE `VENDOR_INFLUENCER_MAPPING`
- ADD UNIQUE INDEX `unique_active_vendor_influencer_status` (`UNIQUE_KEY_HELPER`);
- -- 3. 기존 데이터 정리 (중복 제거)
- -- 활성 상태에서 중복된 레코드가 있다면 가장 최근 것만 남기고 나머지는 비활성화
- UPDATE `VENDOR_INFLUENCER_MAPPING` v1
- JOIN (
- SELECT
- `VENDOR_SEQ`,
- `INFLUENCER_SEQ`,
- `STATUS`,
- MAX(`SEQ`) as latest_seq
- FROM `VENDOR_INFLUENCER_MAPPING`
- WHERE `IS_ACT` = 'Y'
- GROUP BY `VENDOR_SEQ`, `INFLUENCER_SEQ`, `STATUS`
- HAVING COUNT(*) > 1
- ) v2 ON v1.`VENDOR_SEQ` = v2.`VENDOR_SEQ`
- AND v1.`INFLUENCER_SEQ` = v2.`INFLUENCER_SEQ`
- AND v1.`STATUS` = v2.`STATUS`
- AND v1.`SEQ` < v2.latest_seq
- SET v1.`IS_ACT` = 'N',
- v1.`MOD_DATE` = NOW()
- WHERE v1.`IS_ACT` = 'Y';
- -- 4. 검증 쿼리 (중복 레코드 확인)
- -- 아래 쿼리 결과가 0이어야 함
- SELECT
- `VENDOR_SEQ`,
- `INFLUENCER_SEQ`,
- `STATUS`,
- COUNT(*) as duplicate_count
- FROM `VENDOR_INFLUENCER_MAPPING`
- WHERE `IS_ACT` = 'Y'
- GROUP BY `VENDOR_SEQ`, `INFLUENCER_SEQ`, `STATUS`
- HAVING COUNT(*) > 1;
|