[Database] MySQL. Primary Key, Foreign Key
1. Primary Key
DB에서 테이블을 생성할 때 하나 이상의 항목을 Primary Key(기본키)로 설정해줘야한다.
기본키는 해당 테이블에서 가지는 기본적인 값이다. 행을 고유하게 구분해주는 정보라고 볼 수 있을 것이다. 예를 들자면 쇼핑몰의 DB에 회원 테이블에서 회원번호가 기본키가 될 수 있겠다.
기본키로 설정한 항목은 자동적으로 unique(중복 불가), not null 제약조건을 가지게된다.
백문이불여일용. 실사용을 해보자.
예시 활용을 위해 적당히 만들어본 테이블.
course 테이블을 생성하는 쿼리에서 primary key(co_num) 구문을 통해 co_num 컬럼을 기본키로 설정해주었다.
desc course로 테이블 정보를 확인해보면 not null 제약조건이 기본으로 붙은걸 확인 할 수 있다.
MySQL에서는 컬럼을 정의하는 것과 별도로 기본키 설정을 작성해줘야하지만 오라클 DBMS에서는 컬럼 정의 시 제약조건과 같이 작성해주는 것이 가능하다.
2. Foreign Key
Foreign Key(외래키)는 두 테이블을 연결해주는 키를 의미한다.
외래키가 포함된 테이블을 자식 테이블이라고하고 외래키 값을 제공하는 테이블을 부모 테이블이라고한다.
외래키로 지정할 두 테이블의 필드는 데이터 타입이 같아야한다.
실사용을 해보자.
전에 만들어뒀던 student 테이블과 이번에 생성한 course 테이블을 써보려고 한다.
일단 student와 course 테이블을 연결해줄 attend 테이블을 하나 생성했다.
at_st_num 필드를 student 테이블과 연결할 foreign key로 사용할 것이고,
at_co_code 필드를 course 테이블과 연결할 foreign key로 사용할 것이다.
테이블 생성 단계에서도 외래키 설정은 가능하지만 외래키 설정은 별도로 쿼리 작성해본다.
2-1. 외래키 삽입
테이블 수정에서 컬럼을 add 할 때와 마찬가지로, 쿼리문에서 add 다음에 foreign key를 넣으면 된다.
alter table [자식 테이블] add foreign key(자식 테이블의 foreign key가 될 필드) references [부모테이블][(foreign key로 연결될 부모테이블의 필드명)];
attend 테이블의 정볼르 확인해보면 at_st_num, at_co_code의 key값이 Mul(multiple)인 것을 확인할 수 있다.
2-2. 외래키 삭제
외래키 삭제는 다소 번거롭다.
먼저 constraint_name을 확인해준다.
쿼리문에 대한 해석은;
테이블 스키마가 dbpractice이고 테이블 이름이 attend인 테이블의 constraint 정보 전체를 출력한다.
가 되겠다.
설정했던 외래키 두개를 각각 다른 방법을 삭제해본다.
2-3. 외래키 제약조건(on delete 또는 on update 뒤에 붙여 사용)
cascade : 부모 데이터 삭제/업데이트 시 자식 데이터도 삭제/업데이트
set null: 부모 데이터 삭제/업데이트 시 자식 테이블의 연결된 컬럼을 Null로 업데이트
set default: 부모 데이터 삭제/업데이트 시 자식 테이블의 연결된 컬럼을 default 값으로 업데이트
restrict: 자식 테이블이 참조하고 있을 경우, 삭제/업데이트 불가
no action: restrict와 같음. 별도 옵션 지정이 없으면 자동으로 설정된다.
별도의 옵션을 설정하지 않으면 no action으로 세팅되어 부모 데이터를 삭제, 업데이트
이런 옵션들은 생각보다 활용도가 높고 중요하다.
예를 들어 student 테이블과 attend 테이블이 제약조건없이 기본적인 foreign key로 연결되었을 때,
foreign key로 연결된 부모테이블인 student 테이블의 num 컬럼을 수정하려고하면 이렇게 에러를 발생시킨다.
하지만 기존 foreign key를 삭제하고 update cascade 옵션을 갖춘 외래키를 생성한 뒤 시도해보면 잘 반영되는걸 확인 할 수 있다.