009_safe_truncate_with_fk.sql 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. -- ============================================================================
  2. -- 외래키 제약조건을 고려한 안전한 데이터 삭제 및 STATUS 컬럼 제거
  3. -- 작성일: 2024-12-20
  4. -- 목적: 히스토리 테이블 마이그레이션을 위한 기존 데이터 정리 (외래키 안전 처리)
  5. -- ============================================================================
  6. USE influence;
  7. -- 1. 백업용 테이블 생성 (만약의 경우를 대비)
  8. CREATE TABLE IF NOT EXISTS `VENDOR_INFLUENCER_MAPPING_BACKUP_20241220` AS
  9. SELECT * FROM `VENDOR_INFLUENCER_MAPPING`;
  10. CREATE TABLE IF NOT EXISTS `PARTNERSHIP_HISTORY_BACKUP_20241220` AS
  11. SELECT * FROM `PARTNERSHIP_HISTORY`;
  12. -- 2. 외래키 체크 비활성화 (임시)
  13. SET FOREIGN_KEY_CHECKS = 0;
  14. -- 3. 기존 인덱스 제거 (STATUS 관련)
  15. DROP INDEX IF EXISTS `unique_vendor_influencer_status` ON `VENDOR_INFLUENCER_MAPPING`;
  16. DROP INDEX IF EXISTS `idx_vendor_influencer_status` ON `VENDOR_INFLUENCER_MAPPING`;
  17. -- 4. 참조하는 테이블들 먼저 삭제
  18. TRUNCATE TABLE `PARTNERSHIP_HISTORY`;
  19. -- 5. 메인 테이블 데이터 삭제
  20. TRUNCATE TABLE `VENDOR_INFLUENCER_MAPPING`;
  21. -- 6. 외래키 체크 재활성화
  22. SET FOREIGN_KEY_CHECKS = 1;
  23. -- 7. STATUS 컬럼 제거
  24. ALTER TABLE `VENDOR_INFLUENCER_MAPPING`
  25. DROP COLUMN IF EXISTS `STATUS`;
  26. -- 8. 새로운 인덱스 생성 (STATUS 없는 구조)
  27. CREATE INDEX `idx_vendor_influencer` ON `VENDOR_INFLUENCER_MAPPING` (`VENDOR_SEQ`, `INFLUENCER_SEQ`);
  28. CREATE INDEX `idx_mapping_type` ON `VENDOR_INFLUENCER_MAPPING` (`REQUEST_TYPE`, `IS_ACT`);
  29. CREATE INDEX `idx_mapping_dates` ON `VENDOR_INFLUENCER_MAPPING` (`REG_DATE`, `MOD_DATE`);
  30. -- 9. 히스토리 테이블 생성 (새로운 상태 관리용)
  31. CREATE TABLE IF NOT EXISTS `VENDOR_INFLUENCER_STATUS_HISTORY` (
  32. `SEQ` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '시퀀스',
  33. `MAPPING_SEQ` bigint(20) NOT NULL COMMENT '매핑 테이블 시퀀스',
  34. `STATUS` varchar(20) NOT NULL COMMENT '상태값',
  35. `PREVIOUS_STATUS` varchar(20) DEFAULT NULL COMMENT '이전 상태값',
  36. `STATUS_MESSAGE` text DEFAULT NULL COMMENT '상태 변경 메시지',
  37. `CHANGED_BY` bigint(20) DEFAULT NULL COMMENT '상태 변경자 SEQ',
  38. `CHANGED_DATE` datetime NOT NULL DEFAULT current_timestamp() COMMENT '상태 변경 일시',
  39. `IS_CURRENT` char(1) NOT NULL DEFAULT 'Y' COMMENT '현재 상태 여부',
  40. `REG_DATE` datetime NOT NULL DEFAULT current_timestamp() COMMENT '등록일시',
  41. PRIMARY KEY (`SEQ`),
  42. UNIQUE KEY `unique_current_mapping` (`MAPPING_SEQ`, `IS_CURRENT`),
  43. KEY `idx_mapping_seq` (`MAPPING_SEQ`),
  44. KEY `idx_status` (`STATUS`),
  45. KEY `idx_changed_date` (`CHANGED_DATE`),
  46. KEY `idx_current_status` (`IS_CURRENT`, `STATUS`),
  47. CONSTRAINT `fk_status_mapping` FOREIGN KEY (`MAPPING_SEQ`)
  48. REFERENCES `VENDOR_INFLUENCER_MAPPING` (`SEQ`) ON DELETE CASCADE
  49. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='벤더-인플루언서 상태 이력 테이블';
  50. -- 10. 기존 PARTNERSHIP_HISTORY 테이블 구조 확인 및 정리 (필요시)
  51. -- 이 테이블이 더 이상 필요하지 않다면 DROP 가능
  52. -- DROP TABLE IF EXISTS `PARTNERSHIP_HISTORY`;
  53. -- 완료 메시지
  54. SELECT 'VENDOR_INFLUENCER_MAPPING 데이터 정리 및 STATUS 컬럼 제거 완료 (외래키 안전 처리)' as message;
  55. SELECT 'PARTNERSHIP_HISTORY 데이터도 함께 정리됨' as backup_info;
  56. SELECT '백업 테이블: VENDOR_INFLUENCER_MAPPING_BACKUP_20241220, PARTNERSHIP_HISTORY_BACKUP_20241220' as backup_tables;