인간에 대한 테이블을 만들어보자.
내가 생각하는 인간의 속성을 나열해본다.
각각의 독립적인 정보가 한 위치에 있도록 정규화를 해보자.
CREATE TABLE
혈액형과 MBTI는 각각 4개의 값, 16개의 값만 허용하기 때문에 체크 제약조건을 해줬다.
blood_type CHAR(2) CHECK (blood_type IN ('A','B','O','AB')),
와 같이 해도 되지만, 테이블을 정의할 때 enum
을 사용하여 표시했다.
터미널로 입력하다보니 한글자 틀려도 수정이 어려워서 DBeaver를 설치했다.
처음에 쿼리 실행했더니 no database selected
라는 에러가 떴는데, 빨강 네모 부분에서 데이터베이스를 반드시 선택해줘야한다.
desc person;
테이블이 잘 만들어졌는지 확인 😊
person_id
는 생략할 수 없다는 뜻)그럼 Foreign Key 로 연결할 favorite_food 테이블도 만들어보자.
CREATE TABLE favorite_food
(person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY (person_id, food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id) REFERENCES person (person_id)
);
여기서 PK와 FK의 제약조건을 거는 문법이 조금 헷갈렸다.
pk_
나 fk_
로 시작하는 이름이 테이블 어디에서도 볼 수 없었기 때문이다.
CONSTRAINT 제약조건이름 /*위의 코드에서 pk_favorite_food가 해당된다*/
PRIMARY KEY (필드이름)
CONSTRAINT 제약조건이름 /*위의 코드에서 fk_fav_food_person_id가 해당된다*/
FOREIGN KEY (필드이름)
REFERENCES 테이블이름 (필드이름)
제약조건이름은 테이블에는 보이지 않지만 인덱스에서 보인다.
인덱스에 나열되어 있으면 헷갈리니, 일반적으로 pk_테이블명
혹은 fk_테이블명_pk
이런식으로 기억하기 쉽게 쓴다고 한다.