개발 업무를 하려면 필수적으로 ERD를 보게 되는데, 그냥 어렴풋이 넘겨짚었던 개념을 이제서야 정리한다.
DB테이블의 Properties 또는 ERD를 보면 아래 예제처럼 2개 이상의 칼럼이 Primary Key로 지정된 테이블을 볼 수 있다.
지금까지 대강 느낌적으로 잘 사용해서 다행이었지만, 하나의 테이블에 어떻게 기본키가 여러 개 존재할 수 있지?라는 의문을 마음 한구석에 쌓아 두고 있었다. 그래서 확인해본 결과 "테이블은 오직 하나의 기본키(PK)를 가질 수 있다"라는 것은 정확한 정의라는 것을 확인했다. 근데 여기서 포인트는 PK를 오직 하나의 컬럼으로만 설정할 수 있다는 것으로 잘못 해석하면 안 된다라는 점이다. 나는 이 부분을 잘못 이해하고 있었다.
다시 말해, 위 테이블에서 PK로 설정된 "PRODUCT_GROUP_CD", "PRODUCT_CATEGORY_CD" 두 칼럼은 각각의 칼럼이 Unique하게 중복되면 안 되는 것이 아니라, 두 칼럼을 합쳐서 봤을 때 중복이 아니라면 무결성의 원칙을 지키는 것이다.
예) PK의 속성으로 A와 B라는 두 칼럼이 있다면 [ A = 1, B = 1 ] , [ A = 1, B = 2 ] 는 중복된 것이 아니다.
즉, 정확히는 복합키(Composite Key)를 만드는 것이지 기본키(PK)가 복수라는 것은 잘못된 표현이다. 따라서 다음 SQL문에서도 에러가 발생한다.
위에서 말했다시피, 테이블에 PK를 복수로 생성할 수 없다. 그렇다면 기본키를 구성하는 칼럼을 복수로 설정하기 위해서는 어떻게 해야 할까?
위 SQL문과같이 Primary Key 제약조건으로 속성들을 괄호안에 설정해주면 된다.
정리하자면 "기본키를 구성하는 칼럼은 복수일 수 있지만, 기본키가 복수일 수는 없다" 이것만 생각하면 된다.
이 부분은 두 테이블 간의 '식별자와 비식별자 관계' 이론과도 연결되는 개념인데, 실무에서 당황하지 않고 적용시킬 수 있도록 다시 제대로 볼 필요가 있음을 느낀다.
'Database' 카테고리의 다른 글
인덱스 스캔(Index Scan)과 전체 테이블 스캔(Full Table Scan) (0) | 2020.12.14 |
---|---|
Oracle 인덱스(Index)와 B트리 인덱스(트리 기반 인덱스) (0) | 2020.12.11 |
옵티마이저(Optimizer)와 실행계획(Execution Plan) (0) | 2020.11.19 |
오라클 NL Join, Sort Merge Join, Hash Join 특징 총정리 (0) | 2020.10.18 |
오라클 PL/SQL 트리거(Trigger)와 함수(User Defined Function) 특징 및 예제 (0) | 2020.09.29 |