DB 마이그레이션 테이블을 통한 엑셀 일괄 업로드 방법
엑셀 일괄 업로드 절차
- 테이블 CSV 파일에 엑셀 데이터 입력 후 인코딩을 UTF-8로 변경합니다.
- DBeaver 툴에서 마이그레이션 테이블에 CSV 파일을 가져옵니다.
- INSERT SELECT문으로 원본 테이블에 마이그레이션 테이블 데이터를 일괄 등록합니다.
테이블 설계 참고
원본 테이블 설계
제약조건 | 컬럼명 | 데이터 타입 | 기본값 | 설명 |
---|---|---|---|---|
PK | QSTN_STNDRD_ID | varchar(20) | 문항기준ID | |
QSTN_DVSN_CDV | varchar(50) | 문항구분코드값 | ||
PUBSER_CDV | varchar(50) | 출판사코드값 | ||
BOK_NM | varchar(2000) | 교재명 | ||
SHC_LVL | varchar(50) | 학교급 | ||
SHC_YEAR | varchar(4) | 학년 | ||
SHC_TRM | varchar(4) | 학기 | ||
SBJ_CDV | varchar(50) | 과목코드값 | ||
EDU_CRS_CDV | varchar(50) | 교육과정코드값 | ||
PUB_YEAR | varchar(4) | 출판년도 | ||
SOURCE_ID | varchar(50) | 출처ID | ||
DITB_YN | char(1) | 'N' | 관리자배포여부 | |
FILE_STNG | varchar(2000) | 파일설정 | ||
DEL_YN | char(1) | 삭제여부 | ||
FRST_REGER_ID | varchar(20) | 최초등록자ID | ||
FRST_REG_DT | varchar(14) | 최초등록일시 | ||
FRST_REGER_IP | varchar(50) | 최초등록자IP | ||
LAST_MDFER_ID | varchar(20) | 최종수정자ID | ||
LAST_MDFCN_DT | varchar(14) | 최종수정일시 | ||
LAST_MDFER_IP | varchar(50) | 최종수정자IP |
교과서 정보를 저장하는 원본 테이블입니다.
마이그레이션 테이블 설계
제약조건 | 컬럼명 | 데이터 타입 | 기본값 | 설명 |
---|---|---|---|---|
QSTN_STNDRD_ID | varchar(20) | 문항기준ID | ||
SOURCE_ID | varchar(50) | 출처ID | ||
PUBSER | varchar(50) | 출판사 | ||
BOK_NM | varchar(2000) | 교재명 | ||
SHC_LVL | varchar(50) | 학교급 | ||
SHC_YEAR | varchar(4) | 학년 | ||
SHC_TRM | varchar(4) | 학기 | ||
SBJ | varchar(50) | 과목 | ||
EDU_CRS | varchar(50) | 교육과정 |
엑셀로 전달받은 교과서 데이터를 임시 저장하는 마이그레이션 테이블입니다.
엑셀 일괄 업로드 방법
마이그레이션 테이블 DELETE
DELETE FROM im_qstn_stndrd_mig;
마이그레이션 테이블에서 모든 데이터를 삭제합니다.
CSV 내보내기
DBeaver 툴 > 마이그레이션 테이블명 검색 > 테이블 우클릭 > 데이터 내보내기 > CSV 파일로 내보내기 > 다음 > 다음 > CSV 파일을 저장할 폴더 지정 > 진행
이미 내보내기 했던 테이블 CSV 파일이 있다면, 재사용합니다.
엑셀에서 CSV 열기 (CSV 편집)
빈 엑셀 열기 > 데이터 탭 > 외부 데이터 가져오기 > 텍스트 > 구분 기호로 분리됨 체크 > 다음 > 구분기호 : 쉼표 체크 > 다음 > 각 열 선택 후 텍스트 서식으로 변경 > 마침 > 기존 워크시트 선택 > 확인
컬럼을 텍스트 타입으로 지정해서 열지 않으면, 일반 형식으로 열려서 01이 1로 변환되어 버립니다.
CSV 파일에 엑셀 데이터 입력
전달받은 엑셀 데이터를 마이그레이션 테이블 컬럼에 맞춰서 붙여 넣습니다.
Autoincrement로 자동 증가되지 않는 PK라면, MAX 값 조회해서 +1부터 채웁니다.
CSV 파일 저장
Ctrl + S > 다른 이름으로 저장 > 파일 형식 : CSV (쉼표로 분리) (.*.csv) 선택 > 파일명 입력 > 저장 > 예 > 닫기 > 저장 안함
CSV 파일 인코딩 변환
csv 파일을 메모장으로 열고, 다른 이름으로 저장 > 인코딩: UTF-8 선택 후 저장
엑셀로 다시 열었을 때 한국어가 중국어처럼 깨져있어도 정상입니다.
인코딩 변환 이유
엑셀에서 CSV 파일을 저장하면 기본 인코딩이 ANSI이기 때문에,
인코딩 변환 없이 가져오면 DB 인코딩 UTF-8과 달라서 한글이 전부 깨질 수 있습니다.
CSV 가져오기
DBeaver 툴 > 마이그레이션 테이블명 검색 > 테이블 우클릭 > 데이터 가져오기 > CSV에서 가져오기 > Target CSV 파일 지정 > 다음 > 다음 > 진행
CSV 가져오기 에러메시지
Can't init data transfer
이유:
New table creation in database [DB별칭] restricted by connection configuration
위와 같은 에러 팝업이 나오면, DBeaver 상단 데이터베이스 메뉴 아래의 자물쇠 아이콘을 해제하면 됩니다.
INSERT 쿼리 실행
INSERT SELECT 쿼리에서 SELECT 부분을 먼저 조회해보고, 데이터 및 한글 인코딩이 크게 이상 없으면 실행합니다.
INSERT SELECT 쿼리 예시
INSERT INTO im_qstn_stndrd (
qstn_stndrd_id,
qstn_dvsn_cdv,
pubser_cdv,
bok_nm,
shc_lvl,
shc_year,
shc_trm,
sbj_cdv,
edu_crs_cdv,
source_id,
ditb_yn,
del_yn,
frst_reger_id,
frst_reg_dt,
frst_reger_ip
)
SELECT
QSTN_STNDRD_ID,
'01' AS QSTN_DVSN_CDV,
'01' AS PUBSER_CDV,
BOK_NM,
CASE
WHEN SHC_LVL = '중등' THEN 'M0'
WHEN SHC_LVL = '초등' THEN 'E0'
WHEN SHC_LVL = '고등' THEN 'H0'
END AS SHC_LVL,
concat('0', SHC_YEAR) AS SHC_YEAR,
CASE
WHEN SHC_TRM = '1학기' THEN 1
WHEN SHC_TRM = '2학기' THEN 2
ELSE '0'
END AS SHC_TRM,
CASE
WHEN SBJ = '수학' THEN '01'
WHEN SBJ = '국어' THEN '02'
WHEN SBJ = '과학' THEN '03'
WHEN SBJ = '영어' THEN '04'
WHEN SBJ = '사회' THEN '05'
WHEN SBJ = '역사' THEN '06'
WHEN SBJ = '도덕' THEN '07'
END AS SBJ_CDV,
'2015' EDU_CRS_CDV,
SOURCE_ID,
'N' AS DITB_YN,
'N',
'USRCNFRM_99999999999',
DATE_FORMAT(NOW(), '%Y%m%d%H%i%s'),
'0.0.0.0'
FROM
im_qstn_stndrd_mig a
WHERE
QSTN_STNDRD_ID NOT IN (SELECT QSTN_STNDRD_ID FROM im_qstn_stndrd);
교과서 마이그레이션 테이블에서 원본 교과서 테이블로 INSERT 하는 쿼리 예시입니다.
NOT IN을 사용하여 교과서 테이블에 이미 존재하는 교과서 ID는 INSERT 되지 않도록 했습니다.
데이터 정상 확인
SELECT * FROM im_qstn_stndrd
WHERE FRST_REG_DT LIKE '20240402%'
오늘 원본 테이블에 INSERT 한 데이터가 정상적인지 조회하여 확인합니다.
Leave a comment