PRIMARY KEY

 

먼저 주 키 (PRIMARY KEY) 는 테이블에서

1. 레코드들이 가지고 있는 값들 중에 각 레코드들 별로 유니크하게 가지고 있는 항목

2. 중복이 불가능하고, NULL을 입력하는 것도 불가능하다.

 

예를 들어 국민의 개인정보를 관리하는 테이블에서는 주민등록번호가 이런 PRIMARY KEY역할을 한다고 볼 수 있겠다. 등록번호와 이름만 관리하는 임의의 주민 TABLE을 만들어보자면 아래와 같다. (주민등록번호를 PRIMARY키로 설정하겠다)

 

 

 

memID를 PRIMARY KEY로 설정하여 테이블을 생성했다. pgAdmin III에서 해당 테이블을 열어 보면 memID옆에 [PK]라고 PRIMARY KEY임을 표시하고 있다.

 

 

 

예를 들어서 위와같이 memid=1 인 아이유가 이미 테이블에 들어 있는데 같은 id로 수지를 입력하려고 하면 아래 output과 같이 PRIMARY KEY라서 중복된 키 값을 입력할 수 없다는 출력이 뜨면에 에러가 발생한다.

 

또한 memID를 NULL로 설정해놓고 입력을 할려고 해도, NULL이 허용되지 않는  PRIMARY KEY의 조건때문에 에러가 발생하게 된다.

 

FOREIGN KEY

 

FOREIGN KEY는 다음과 같은 경우라고 생각하면 된다.

일단 앞서 만든 주민 테이블이 노원구 주민 테이블이라고 생각해보자. 노원 도서관을 활용하는 사람들의 이용 실적 테이블을 만드는데 사실 노원 도서관은 노원 구민뿐 아니라 다른 구 시민도 사용한다. 따라서 노원구 사람들의 노원도서관 이용실적을 만들기 위해서는 도서관을 이용하는 사람들의 명부를 작성하되 그 사람이 노원구민일 때만 명부를 작성하면 된다.

 

이런 방법을 위해서는 명부를 작성할 때 그 사람의 주민 번호가 주민 테이블에 있는 번호인지 확인해야 한다. 이런 경우 주민 테이블의 memID를 FOREIGN KEY라고 한다.

 

그럼 실제로 사용실적을 작성할 테이블 usageTable을 만들어보자.

앞서 아이유, 수지, 박보영이 살고 있는 구의 주민 테이블을 다음과 같이 작성하였다.

그리고 아래 쿼리 문으로 usageTable을 만들었다. usageTable의 memID는 membershipTable의 memID 열에 REFERENCES를 두었다.

 

 

 

자.. 이제 테스트를 한번 해보자..

 

 

다른 구에 살고 있는 id 4번의 미란다 커가 노원구 도서관에 12월 5일에 왔다.

그래서 이용 실적에 넣어 보려고 하다보니까, 노원구 주민 테이블에 미란다 커의 주민등록 번호 4번이 없기 때문에 아래와 같이 에러가 발생하게 되었다.

 

그럼 다음 테스트를 보자..

다른 구에 살고 있는 테일러 스위프트가 노원도서관에 왔다. 그런데 테일러 스위프트가 외국인이다 보니 아직 주민등록 번호가 없단다. 그래서 다음과 같이 memID에 NULL을 입력했다.

 

결과는...? 

 

읭?

등록이 되었다.

 

사실 이건 의도한 바가 아니긴 한데, 이런 경우는 usageTable의 memid를 NULL값이 오지 못하도록 따로 설정을 해주어야 한다. 이것은 pgAdmin III에서 쉽게 할 수 있는데, usageTable의 column으로 가서 해당 memid의 NULLable항목을 체크해제 해주면 여기에 NULL을 넣은 레코드가 생성되지 못하게 막을 수 있다.

 

이런 개념을 maintainning data integrity라고 한단다. 형식상 잘못된 데이터를 허용하지 않는다는 개념이다.

Posted by 굿쟌
,