011_mariadb_safe_dynamic.sql 4.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. -- ============================================================================
  2. -- MariaDB 안전 버전 - 동적 SQL 개선된 데이터 삭제 및 STATUS 컬럼 제거
  3. -- 작성일: 2024-12-20
  4. -- 목적: 히스토리 테이블 마이그레이션을 위한 기존 데이터 정리 (MariaDB 안전 처리)
  5. -- 호환성: MariaDB 10.x+
  6. -- ============================================================================
  7. USE influence;
  8. -- 1. 백업용 테이블 생성 (만약의 경우를 대비)
  9. CREATE TABLE IF NOT EXISTS `VENDOR_INFLUENCER_MAPPING_BACKUP_20241220` AS
  10. SELECT * FROM `VENDOR_INFLUENCER_MAPPING`;
  11. CREATE TABLE IF NOT EXISTS `PARTNERSHIP_HISTORY_BACKUP_20241220` AS
  12. SELECT * FROM `PARTNERSHIP_HISTORY`;
  13. -- 2. 외래키 체크 비활성화 (임시)
  14. SET FOREIGN_KEY_CHECKS = 0;
  15. -- 3. 기존 인덱스 제거 (STATUS 관련)
  16. DROP INDEX IF EXISTS `unique_vendor_influencer_status` ON `VENDOR_INFLUENCER_MAPPING`;
  17. DROP INDEX IF EXISTS `idx_vendor_influencer_status` ON `VENDOR_INFLUENCER_MAPPING`;
  18. -- 4. 참조하는 테이블들 먼저 삭제
  19. TRUNCATE TABLE `PARTNERSHIP_HISTORY`;
  20. -- 5. 메인 테이블 데이터 삭제
  21. TRUNCATE TABLE `VENDOR_INFLUENCER_MAPPING`;
  22. -- 6. 외래키 체크 재활성화
  23. SET FOREIGN_KEY_CHECKS = 1;
  24. -- 7. STATUS 컬럼 제거 (MariaDB 안전 방식)
  25. -- 컬럼 존재 여부 확인
  26. SELECT COUNT(*) as status_column_exists
  27. FROM INFORMATION_SCHEMA.COLUMNS
  28. WHERE TABLE_SCHEMA = 'influence'
  29. AND TABLE_NAME = 'VENDOR_INFLUENCER_MAPPING'
  30. AND COLUMN_NAME = 'STATUS';
  31. -- STATUS 컬럼이 존재한다면 수동으로 제거 (동적 SQL 대신 직접 실행)
  32. -- 아래 주석을 해제하고 실행하거나, 별도로 실행
  33. -- ALTER TABLE `VENDOR_INFLUENCER_MAPPING` DROP COLUMN `STATUS`;
  34. -- 8. 새로운 인덱스 생성 (STATUS 없는 구조)
  35. CREATE INDEX IF NOT EXISTS `idx_vendor_influencer` ON `VENDOR_INFLUENCER_MAPPING` (`VENDOR_SEQ`, `INFLUENCER_SEQ`);
  36. CREATE INDEX IF NOT EXISTS `idx_mapping_type` ON `VENDOR_INFLUENCER_MAPPING` (`REQUEST_TYPE`, `IS_ACT`);
  37. CREATE INDEX IF NOT EXISTS `idx_mapping_dates` ON `VENDOR_INFLUENCER_MAPPING` (`REG_DATE`, `MOD_DATE`);
  38. -- 9. 히스토리 테이블 생성 (새로운 상태 관리용)
  39. CREATE TABLE IF NOT EXISTS `VENDOR_INFLUENCER_STATUS_HISTORY` (
  40. `SEQ` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '시퀀스',
  41. `MAPPING_SEQ` bigint(20) NOT NULL COMMENT '매핑 테이블 시퀀스',
  42. `STATUS` varchar(20) NOT NULL COMMENT '상태값',
  43. `PREVIOUS_STATUS` varchar(20) DEFAULT NULL COMMENT '이전 상태값',
  44. `STATUS_MESSAGE` text DEFAULT NULL COMMENT '상태 변경 메시지',
  45. `CHANGED_BY` bigint(20) DEFAULT NULL COMMENT '상태 변경자 SEQ',
  46. `CHANGED_DATE` datetime NOT NULL DEFAULT current_timestamp() COMMENT '상태 변경 일시',
  47. `IS_CURRENT` char(1) NOT NULL DEFAULT 'Y' COMMENT '현재 상태 여부',
  48. `REG_DATE` datetime NOT NULL DEFAULT current_timestamp() COMMENT '등록일시',
  49. PRIMARY KEY (`SEQ`),
  50. UNIQUE KEY `unique_current_mapping` (`MAPPING_SEQ`, `IS_CURRENT`),
  51. KEY `idx_mapping_seq` (`MAPPING_SEQ`),
  52. KEY `idx_status` (`STATUS`),
  53. KEY `idx_changed_date` (`CHANGED_DATE`),
  54. KEY `idx_current_status` (`IS_CURRENT`, `STATUS`),
  55. CONSTRAINT `fk_status_mapping` FOREIGN KEY (`MAPPING_SEQ`)
  56. REFERENCES `VENDOR_INFLUENCER_MAPPING` (`SEQ`) ON DELETE CASCADE
  57. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='벤더-인플루언서 상태 이력 테이블';
  58. -- 10. 현재 상태 확인
  59. SELECT 'VENDOR_INFLUENCER_MAPPING 데이터 정리 완료' as message;
  60. SELECT 'PARTNERSHIP_HISTORY 데이터도 함께 정리됨' as backup_info;
  61. SELECT '백업 테이블: VENDOR_INFLUENCER_MAPPING_BACKUP_20241220, PARTNERSHIP_HISTORY_BACKUP_20241220' as backup_tables;
  62. -- 11. STATUS 컬럼 제거가 필요한지 확인
  63. SELECT
  64. CASE
  65. WHEN COUNT(*) > 0 THEN '⚠️ STATUS 컬럼이 아직 존재합니다. 다음 명령을 별도로 실행하세요: ALTER TABLE VENDOR_INFLUENCER_MAPPING DROP COLUMN STATUS;'
  66. ELSE '✅ STATUS 컬럼이 정상적으로 제거되었습니다.'
  67. END as status_column_check
  68. FROM INFORMATION_SCHEMA.COLUMNS
  69. WHERE TABLE_SCHEMA = 'influence'
  70. AND TABLE_NAME = 'VENDOR_INFLUENCER_MAPPING'
  71. AND COLUMN_NAME = 'STATUS';
  72. -- 12. 테이블 구조 확인
  73. DESCRIBE `VENDOR_INFLUENCER_MAPPING`;
  74. DESCRIBE `VENDOR_INFLUENCER_STATUS_HISTORY`;