* Primary Key와 Foreign Key 관계 이해하기
DB의 목적은 많은 데이터를 보관 및 관리하는 것
이를 위해 필수적인 것이 바로 데이터의 무결성
데이터에 결점이 있다면 그 DB는 쓸모가 없어지며, 잘못된 결과를 초래할 수도 있다.
때문에 DB의 데이터는 목적에 맞게 입력되야 하며, 규칙에 맞게 저장되어야 한다. 이를 위해 DB시스템은 데이터에 접근하거나 데이터를 처리할 때마다 부적절한 데이터가 입력되는지 검사하여 데이터의 결점 없음을 유지한다.
여기서 무결성이란?
무결성 제약은 DB내에 저장되는 데이터의 값들이 항상 일관성을 갖고 데이터의 유효성, 정확성, 신뢰성을 유지할 수 있도록 제약조건을 두는 DB의 특성이다.
Primary key와 Foreign key의 참조 무결성
외래 키가 있는 테이블의 경우에는 기본 키와 외래 키 간의 상관관계가 항상 유지됨을 보장한다.
참조하는 외래 키가 존재하면 행은 삭제될 수 없고 기본 키도 변경될 수 없다.
참고: <모두의 SQL:누구나 쉽게 배우는 데이터 분석 기초>_ 김도연 저
데이터의 무결성을 보장해줄 수 있는 것이 바로 Primary key(이하 PK)와 Foreign key(이하 FK)이다.
데이터의 무결성이 어떻게 이루어지는지 위의 School table과 student table를 예시로 들어보겠다.
PK는 unique, not null의 제약조건을 기본적으로 내재하고 있으며, 한 테이블에 한 개의 컬럼만 PK로 지정할 수 있다. 때문에 PK는 테이블 내에서 데이터의 유일성을 보장해준다. School table의 학과 코드는 학과마다 한 개 씩만 존재해야 하며 중복되어 존재하면 안되기 때문에 PK로 설정하기에 적절하다.
만일 모든 학생이 반드시 하나의 학과에 등록 되어있어야 한다는 조건이 있다면,
student table에도 학과 코드가 있어야 한다.
이 때 School table의 학과 코드에 student table의 학과코드를 FK로 참조시킨다면
학생을 등록할 때 student table의 학과코드는 School table의 학과코드에 항상 해당하는 코드가 있는지 묻게 된다.
만약 여기서 양 테이블의 학과코드를 연결시켜 놓지 않았다면, 학과코드가 잘못 입력되어 어느 학과에도 소속되지 않은 학생 DB 데이터가 입력될 수도 있었을 것이다.
즉, PK와 FK간의 연결을 통해
student table의 학과코드에 잘못된 값이 입력되지 않도록 정확성과 신뢰성이 보장되는 것이다.
* Primary Key
Primary key제약은 해당 테이블에 한 개만 걸 수 있으며,
unique, not null 조건이 함께 걸린다.
PK는 기본키, FK를 거느리는 부모키라고도 불린다.
기본적으로 FK에 의해 참조되고 있는 PK는 삭제할 수 없다.
참조되지 않고 있거나, FK 제약을 걸 때 ON DELETE CASCADE연산자와 함께쓴 경우 삭제가 가능하다.
다만, ON DELETE CASCADE연산자와 함께쓴 FK가 걸린 컬럼은 PK가 삭제될 때 함께 삭제된다.
CREATE TABLE 테이블이름 (
컬럼이름 데이터타입 CONSTRAINT 제약조건이름 PRIMARY KEY (제약을걸컬럼이름)
);
위에서 sawon 테이블을 만들며 sabun이라는 컬럼에 PK를 걸어둔 것을 확인할 수 있다.
* Foreign Key
FK는 PK를 참조하는 제약조건이며, 외래키, 자식키 라고도 불린다.
FK 제약을 거는 컬럼의 데이터타입은 PK가 걸린 컬럼의 데이터타입과 동일해야 한다.
이를 어기면 참조 무결성 제약에 의해 테이블을 생성할 수 없다.
CREATE TABLE 테이블이름 (
컬럼이름 데이터타입,
CONSTRAINT 제약이름 FOREIGN KEY (제약걸컬럼이름) REFERENCES 기본키테이블이름(기본키걸린컬럼이름)
);
'Database > Oracle' 카테고리의 다른 글
SQL-Oracle_제약조건03] Column에 제약조건(Constraint) 이름 설정규칙 (0) | 2021.06.11 |
---|---|
SQL-Oracle_제약조건01] Column에 제약조건(Constraint)걸기/확인하기 (0) | 2021.06.09 |
SQL-Oracle] Recode 중복 제거하고 가져오기(Distinct) (0) | 2021.06.08 |
SQL-Oracle] Alter를 이용하여 Table의 컬럼 추가/수정/이름재설정/삭제 (0) | 2021.06.08 |
SQL-Oracle] 현재 시스템의 날짜를 가져오는 명령어 (0) | 2021.06.07 |