문제은행 DB 설계 분투기 6 - forign key 넣는 SQL문

양태환·2023년 9월 12일

인턴기

목록 보기
6/14

만든 ERD를 가지고 정규화와 역정규화를 진행해보려합니다.

정규화는 릴레이션을 무손실 분해함으로써
발생할 수 있는 갱신 이상과 중복을 최소화하여
일관성과 정확성을 유지하기 위한 과정입니다.

주어진 릴레이션 스키마를 함수적 종속성과 기본 키를 기반으로 분석합니다.

역정규화는 분해한 릴레이션의 사용방법을 생각해보며 성능을 높이는 과정입니다.

정규화는 끝마쳤고, 역정규화를 하려하는데 데이터를 어떻게 가져올지 모르네요
그래서 일단 테이블을 만들고 웹페이지에 기능들을 만들어보면서 필요한 쿼리들을 만들어보며 역정규화를 그때그때 진행하려 합니다.


일단 테이블 만들기

그래서 erdcloud.com에서 export 한 sql문으로 테이블을 만들고
GPT에게 부탁해서 각 테이블 당 10개의 더미 데이터를 만들어달라고 요청했습니다.

그리고 INSERT문으로 집어넣으려는데 존재하는 FORIGN KEY를 넣어야한다고 하면서
뭐라고 뜨네요 그래서 광고 회사 데이터는 아직 넣지도 않았는데
광고회사가 존재한 뒤에 생기는 contract_ID를 먼저 집어넣고 있는 요상한 상황이 벌어졌네요

그래서 생각해보니 제가 ERD를 그릴 때 관계를 잘못 연결해놨더라구요
광고기업과 계약정보는 1:N의 관계이어야하고,
광고 기업 하나가 0개 이상의 계약 정보와 관계를 맺을 수 있죠

그러니 ALTER TABLE 로 forign key를 넣는 sql문을 바꿔봅시다.

forign key 넣는 방법 학습

  • 참조 링크

    방법 1 - CREATE 문으로 FOREIGN KEY 설정

  • 문법

CREATE TABLE 테이블이름

(

    필드이름 필드타입,

    ...,

    [CONSTRAINT 제약조건이름]

    FOREIGN KEY (필드이름)

    REFERENCES 테이블이름 (필드이름)

)
  • 예제
CREATE TABLE Test2

(

    ID INT,

    ParentID INT,

    FOREIGN KEY (ParentID)

    REFERENCES Test1(ID) ON UPDATE CASCADE

);
  • ON UPDATE CASCADE이란?
    ON UPDATE CASCADE를 설정해주면 Test1의 ID가 변경되었을 때,
    Test2의 ParentID도 자동으로 바뀌도록 설정됩니다.
    참조 블로그 링크 - https://kimtaehyun98.tistory.com/122

방법 2 - ALTER 문으로 FOREIGN KEY 설정

  • 문법
ALTER TABLE 테이블이름

ADD [CONSTRAINT 제약조건이름]

FOREIGN KEY (필드이름)

REFERENCES 테이블이름 (필드이름)
  • 예제
ALTER TABLE Reservation

ADD CONSTRAINT CustomerID

FOREIGN KEY (ID)

REFERENCES Customer (ID);

추가문법 - Foreign Key 삭제 방법

ALTER TABLE 테이블이름
DROP FOREIGN KEY 제약조건이름

이면 된다고 하네요

그럼 예시로

ALTER TABLE 'ADVERTISE_CMPNY'
DROP FOREIGN KEY 'FK_CMPNY_CNTRCT_INFO_TO_ADVERTISE_CMPNY_1'

을 수행하면 되겠습니다.

(MySQL은 ' 이 기호 대신 ` 이 기호를 쓰나봅니다.) - 참조한 링크
일반 따옴표('')로 둘러싸이면 평범한 문자열로 인식을 하지만
backtick(``)로 둘러싸이면 SQL에서 식별자로 인식합니다.


delete, insert의 중요성을 깨닫는 시간

ALTER TABLE `CMPNY_CNTRCT_INFO` ADD CONSTRAINT `FK_ADVERTISE_CMPNY_TO_CMPNY_CNTRCT_INFO_1` FOREIGN KEY (
	`CMPNY_CO`
)
REFERENCES `ADVERTISE_CMPNY` (
	`CMPNY_CO`
);

위의 코드를 실행하려고 하니
CMPNY_CO 칼럼이 CMPNY_CNTRCT_INFO에 없다고 합니다.
없는 게 당연하죠.

그래서 테이블을 지우고 다시 만드려고하니
이 테이블 지우면 qustn_info 테이블이 이 테이블을 참조하기 때문에
지울 수 없다고 합니다.

이런.... 이래서 처음 설계가 잘못되면 골치아파지는 것이군요

그래서 테이블 칼럼을 추가하는 코드를 검색해봤습니다.
참조한 블로그 링크

alter table [테이블명] add [컬럼명] [타입] [옵션]; 
ex) alter table [테이블명] add [컬럼명] varchar(100) not null default '0'; 

추가해서 하다가 계속 오류가 나서... 계속 오류가 나는 바람에...
시간관계상 그냥 테이블을 다 밀어버리고 다시 만들었습니다.

그러다보니 또 생기는 오류는
몇 개 바뀐 테이블 더미 데이터만 따로 만들어달라고 GPT에게 요청하니
예전 데이터들과 이름이 다른 데이터를 넣어놓았더라구요.
결국 다시 GPT 채팅창을 새로 파서 새로 만들었습니다.

데이터를 넣고 빼고 하는 순서가 굉장히 중요했다.

테이블 삭제(DROP TABLE 그리고 delete from ~)하는 거서부터
테이블에 데이터 넣는 것(insert into ~ 까지 순서가 다 정해져있으니까

굉장히 복잡하네요....

draw.io 로 delete, insert 시 참고할 순서도를 만들어보겠습니다.

이렇게 만들어졌구요

이 방향표를 보면
어떤 순서로 delete, insert해야하는지 알 수 있습니다!

다음부터 ERD를 만들게 되면 이 화살표로 추상화된 표를 보며 drop, delete, insert를 실행하면 될 것 같습니다.

profile
당신의 오류 제가 잡아드립니다.

0개의 댓글