문제은행 DB 설계 분투기 7 - TABLE 만들기 관련 SQL문

양태환·2023년 9월 13일

인턴기

목록 보기
7/14

내가 만든 ERD와 회사에서 만든 ERD의 차이점

제가 회사 인턴을 하며 만든 문제은행 ERD와 회사에서 받은 ERD에는 다른 점이 있습니다.
  1. 네이밍 규칙이 존재

  2. 테이블에 들어있는 애트리뷰트가 엄청 많음
    제가 작성한 사용자 테이블에는 아이디, 코드, 유입 서비스 명 만 들어있었다면
    회사에서 실제로 사용하는 이름, 이메일, 사용유무, 회사명, 회사코드 등이 들어있네요

다대다 관계로 만들어진 테이블에서 기본키를 결정하는 방법
구글 검색어에 '다대다 관계 해소의 이유와 과정', '다대다 관계 테이블' 이 있네요
검색해서 공부해봐야겠습니다.

검색해서 공부한 다대다 관계 테이블 설명 글들 입니다.
링크1 - https://goodteacher.tistory.com/466
링크2 - https://ryulstudy.tistory.com/114

실전 문제은행 DB설계 시작

회사에서 실제로 사용할 문제은행을 만들어보려고합니다.
문제은행 제작 과정을 기록하면서 어떤 부분을 배우고, 어디서 제 실수가 나는지를 확인해보겠습니다.

1. MySQL 버전 확인

제가 사용하고있는 MySQL 버전은 8.0버전이고
회사에서 사용하는 MySQL 버전은 5.7버전입니다.

차이점을 알아보고 다운그레이드 해야한다면 하도록 하겠습니다.

5.7 버전과 8 버전의 차이
참고 링크 - https://velog.io/@minbo2002/MySQL5.7MySQL8.0
참조 링크 - https://wonsjung.tistory.com/582

  • 사용자 인증 방식 5.7 - Native Authentication, 8.0 - Caching SHA-2 Authentication
  • 외래키 이름 64글자로 제한
  • 인덱스 힌트 성능 저하
  • 파티션의 각 테이블스페이스를 공용테이블스페이스에 저장 불가

즉 새로 테이블을 만든다면 크게 문제될 게 없으므로 8.0 버전을 그대로 사용하겠습니다!

2. 테이블을 만들기

auto_increment 설정

테이블을 만들때 erdcloud.com에서 만들어준 쿼리문을 쓰는데 여기는 auto_increment까지 체크해서 지원해주진 않는다. 그렇기 때문에 auto_increment를 type 부분에 int 뒤에 넣어준다면 (``` int auto_increment``` <-- 이렇게) auto_increment를 손으로 설정해주지 않서 더 안정적이다.

그래서 그렇게 해서 넣으려고 하는데
오류가 난다. - 링크

엥? 왜 안 될까 고민하다가
검색해서 살펴보기

"AUTO_INCREMENT를 추가하는 컬럼은 기본키 설정을 가지고 있어야 한다. (무조건은 아니다. 하지만 대부분의 경우에서)" 라는 글을 봤습니다.

실제로 MySQL Output 창에서

	Error Code: 1075. Incorrect table definition; there can be only one auto column and it must be defined as a key	0.000 sec

가 나오네요

그러므로 기본키가 설정되어있어야 AUTO_INCREMENT를 사용할 수 있는 것이다.
그래서 AUTO_INCREMENT를 뒤로 ALTER TABLE 코드에서 설정하도록 쿼리문의 제일뒤로 뺐습니다.

ALTER TABLE QB_HINT MODIFY HINT_ID INT NOT NULL AUTO_INCREMENT;

이 ALTER 쿼리문을 테이블 생성 뒤에 넣어줬더니 잘 돌아가더라구요
완료!

똑같은 insert문을 두번 눌렀을 때 대처법

더미 데이터를 넣고 테스트를 해보려하는데
insert문을 여러 번 하면
그 데이터가 곧장 다 들어가더라고요

이 문제를 해결해보려고합니다. - 참조한 설명글 링크
PRIMARY KEY를 설정해주면 된다고 합니다.
그런데 제가 PRIMARY KEY를 설정해줬음에도 같은 insert문의 데이터가 곧장 다 들어간 이유는 auto_increment로 올라가는 id 칼럼이 있었기 때문입니다.

delete문 살짝의 오류

테이블에 데이터를 잘못 넣어서 삭제하려고 쿼리문을 날렸더니 이런 오류가 떴습니다.

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column. 
 To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.	0.000 sec

이 오류는 검색해보니까
delete문을 쓸 때 기본키를 사용하여 삭제하지 않으면 띄우는 오류라고 합니다.
그렇기때문에 기본키를 가지고 행을 삭제하거나
아니면 safe mode를 끄면 된다고 합니다.

기본키를 가지고 삭제하는 게 안전하기 때문에 safe mode를 끄진 않겠습니다.

쿼리문에서 for문 쓰기

이 블로그 글을 참고하여 사용해봤습니다. -

-- for문 사용하기
DELIMITER $$ 
CREATE PROCEDURE myFunction() -- ⓐ myFunction이라는 이름의 프로시져
BEGIN
    DECLARE i INT DEFAULT 1; -- ⓑ i변수 선언, defalt값으로 1설정
    WHILE (i <= 10) DO -- ⓒ for문 작성(i가 1000이 될 때까지 반복)
        delete from qb_qustn_grp_mapping WHERE GRP_QUSTN_ID=(i); -- ⓓ 테이블에 i값 넣어주기
        SET i = i + 1; -- ⓔ i값에 1더해주고 WHILE문 처음으로 이동
    END WHILE;
END$$
DELIMITER ; -- ⓕ구분 기호를 다시 ;로 바꿔주기
CALL myFunction();

코드를 그대로 가져와서 조금만 수정해봤죠

잘 돌아가니까 기분이 좋더라고요

이렇게 더미데이터를 모두 완성하고 집어넣어봤습니다.


궁금했던 질문들

3가지 질문을 했고 간략하게 적어보겠습니다.

  1. varchar( 여기에 들어가는 숫자 ) 가 글자수를 의미하는지
  2. -> 맞습니다.

  3. 다대다 관계 테이블에서 0~N : 0~M 관계로 맺은 이유는 사용하지 않는 그룹코드가 있기 때문인가요?
  4. -> 그렇기도 하고, 만들어놓고 매핑을 안 할 수도 있고, 매핑한 문제들이 모두 삭제될 수도 있기 때문입니다.

  5. 위 2번의 테이블에 ID값을 가진 애트리뷰트가 추가된 이유가 무엇인가요?
  6. -> ID로만 데이터를 삭제, 수정이 가능한 편의때문에 추가하였습니다.
profile
당신의 오류 제가 잡아드립니다.

0개의 댓글