# MariaDB 호환 DDL 스크립트 작성 규칙 ## 📋 기본 원칙 **모든 DDL 스크립트는 MariaDB 호환성을 최우선으로 작성한다.** ## 🔧 MariaDB 전용 구문 규칙 ### 1. 컬럼 삭제 (DROP COLUMN) #### ❌ 사용 금지 (MySQL 8.0+ 전용) ```sql ALTER TABLE table_name DROP COLUMN IF EXISTS column_name; ``` #### ❌ 문제 있는 동적 SQL (MariaDB에서 불안정) ```sql -- 이 방식은 MariaDB에서 PREPARE/EXECUTE 오류 발생 가능 SET @sql = (SELECT IF(...)); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; ``` #### ✅ MariaDB 안전 방식 (권장) ```sql -- 1. 컬럼 존재 여부 확인 (정보성) SELECT COUNT(*) as column_exists FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name' AND COLUMN_NAME = 'column_name'; -- 2. 사용자 안내 메시지 제공 SELECT CASE WHEN COUNT(*) > 0 THEN '⚠️ 컬럼이 존재합니다. 다음 명령을 별도로 실행하세요: ALTER TABLE table_name DROP COLUMN column_name;' ELSE '✅ 컬럼이 존재하지 않습니다.' END as column_check FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name' AND COLUMN_NAME = 'column_name'; -- 3. 주석으로 수동 실행 명령 제공 -- ALTER TABLE `table_name` DROP COLUMN `column_name`; ``` ### 2. 인덱스 생성 #### ✅ 권장 방식 ```sql -- MariaDB에서 지원하는 안전한 인덱스 생성 CREATE INDEX IF NOT EXISTS `index_name` ON `table_name` (`column1`, `column2`); ``` #### ❌ 주의사항 ```sql -- MariaDB 오래된 버전에서는 IF NOT EXISTS 미지원할 수 있음 -- 이 경우 DROP INDEX IF EXISTS 후 CREATE INDEX 사용 DROP INDEX IF EXISTS `index_name` ON `table_name`; CREATE INDEX `index_name` ON `table_name` (`column1`, `column2`); ``` ### 3. 외래키 제약조건 #### ✅ 안전한 외래키 처리 ```sql -- 외래키 체크 임시 비활성화 (TRUNCATE 시 필요) SET FOREIGN_KEY_CHECKS = 0; -- 작업 수행 TRUNCATE TABLE `child_table`; TRUNCATE TABLE `parent_table`; -- 외래키 체크 재활성화 SET FOREIGN_KEY_CHECKS = 1; ``` ### 4. 테이블 수정 (ALTER TABLE) #### ✅ 단계별 안전한 수정 ```sql -- 1. 백업 테이블 생성 CREATE TABLE IF NOT EXISTS `table_backup_YYYYMMDD` AS SELECT * FROM `original_table`; -- 2. 컬럼 추가 ALTER TABLE `original_table` ADD COLUMN IF NOT EXISTS `new_column` varchar(50) DEFAULT NULL; -- 3. 컬럼 수정 (MariaDB 호환) ALTER TABLE `original_table` MODIFY COLUMN `existing_column` varchar(100) NOT NULL; ``` ### 5. 데이터 타입 #### ✅ MariaDB 호환 데이터 타입 ```sql -- 문자열 varchar(255) COLLATE utf8mb4_unicode_ci text COLLATE utf8mb4_unicode_ci -- 숫자 bigint(20) int(11) decimal(10,2) -- 날짜/시간 datetime DEFAULT current_timestamp() timestamp DEFAULT current_timestamp() ON UPDATE current_timestamp() -- 불린 char(1) DEFAULT 'N' -- 'Y'/'N' 방식 권장 ``` ## 📝 DDL 스크립트 템플릿 ### 기본 구조 ```sql -- ============================================================================ -- [작업 설명] -- 작성일: YYYY-MM-DD -- 목적: [목적 설명] -- 호환성: MariaDB 10.x+ -- ============================================================================ USE database_name; -- 1. 백업 생성 (필수) CREATE TABLE IF NOT EXISTS `backup_table_YYYYMMDD` AS SELECT * FROM `original_table`; -- 2. 외래키 체크 비활성화 (필요시) SET FOREIGN_KEY_CHECKS = 0; -- 3. 작업 수행 -- ... DDL 작업 ... -- 4. 외래키 체크 재활성화 (필요시) SET FOREIGN_KEY_CHECKS = 1; -- 5. 컬럼 존재 확인 및 안내 (필요시) SELECT CASE WHEN COUNT(*) > 0 THEN '⚠️ 추가 작업이 필요합니다: [수동 명령]' ELSE '✅ 모든 작업이 완료되었습니다.' END as manual_check FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'database_name' AND TABLE_NAME = 'table_name' AND COLUMN_NAME = 'column_name'; -- 6. 테이블 구조 확인 DESCRIBE `modified_table`; -- 7. 완료 메시지 SELECT '작업 완료' as message; SELECT '백업 테이블: backup_table_YYYYMMDD' as backup_info; ``` ## 🚨 주의사항 ### 1. 백업 필수 - 모든 DDL 작업 전 백업 테이블 생성 - 백업 테이블명: `원본테이블명_BACKUP_YYYYMMDD` 형식 ### 2. 동적 SQL 제한 - MariaDB에서 PREPARE/EXECUTE 구문은 불안정할 수 있음 - 가능하면 정적 SQL 사용하고, 필요시 수동 실행 안내 ### 3. 트랜잭션 제한 - DDL은 자동 커밋되므로 롤백 불가 - 중요한 작업은 단계별로 분리하여 실행 ### 4. 외래키 처리 - TRUNCATE 전 반드시 외래키 체크 비활성화 - 작업 완료 후 즉시 재활성화 ### 5. 컬럼/인덱스 존재 확인 - 중복 생성 방지를 위해 존재 여부 확인 - INFORMATION_SCHEMA 활용하여 확인 후 안내 ## ✅ 검증 체크리스트 DDL 스크립트 작성 시 다음 사항을 확인: - [ ] MariaDB 호환 구문 사용 - [ ] 동적 SQL 대신 정적 SQL + 수동 안내 방식 사용 - [ ] 백업 테이블 생성 포함 - [ ] 외래키 처리 포함 (필요시) - [ ] 컬럼 존재 확인 및 안내 메시지 포함 - [ ] 테이블 구조 확인 포함 - [ ] 완료 메시지 포함 - [ ] 주석으로 작업 내용 명시 ## 🔍 테스트 방법 ```sql -- 1. 구문 검사 -- DDL 스크립트를 테스트 DB에서 먼저 실행 -- 2. 백업 확인 SELECT COUNT(*) FROM backup_table_YYYYMMDD; -- 3. 구조 확인 DESCRIBE modified_table; -- 4. 제약조건 확인 SHOW CREATE TABLE modified_table; -- 5. 수동 작업 확인 -- 스크립트 실행 후 안내 메시지에 따라 추가 작업 수행 ``` **모든 DDL 스크립트는 이 규칙을 준수하여 MariaDB 호환성을 보장한다.** description: globs: alwaysApply: false ---