[SQL] SQL 키 정리

데이터베이스 관리 시스템에서 데이터의 무결성을 유지하고 효율적으로 관리하기 위해 다양한 키(Key) 개념을 사용한다. 이때 후보키 (Candidate Key), 기본키(Primary Key), 슈퍼키(Super Key), 고유키(Unique Key), 외래키(Foreign Key)가 주로 활용되는데 이 개념들을 이해하기 위해 학생 정보를 관리하는 데이터베이스를 예로 들어 설명해 보겠다.


후보키 (Candidate Key)

유일성과 최소성을 만족하는 키

기본키(Primary Key)

기본키는 테이블에서 각 행(Row)의 고유한 식별자로 사용, 기본키로 설정된 필드는 중복된 값을 가질 수 없으며 NULL 값을 허용하지 않는다. 예를 들어, 학생 정보를 관리하는 테이블에서는 '학번'이 기본키로 설정될 수 있다. 학번을 통해 테이블에서 각 학생을 유일하게 식별할 수 있는 것이다.

슈퍼키(Super Key)

슈퍼키는 테이블 내에서 행을 유일하게 식별할 수 있는 하나 이상의 속성(필드)의 집합이다. 기본키도 슈퍼키의 한 종류지만 슈퍼키는 불필요한 속성을 포함할 수 있다. 예를 들어, 학생 테이블에서 '학번, 이름'의 조합도 슈퍼키가 될 수 있지만 '학번'만으로도 각 행을 유일하게 식별할 수 있으므로 '학번, 이름'은 최소성을 만족하지 않는 슈퍼키이다.

즉 유일성은 만족하지만 최소성은 만족하지 않는다.

고유키(Unique Key)

고유키는 테이블 내의 각 행을 유일하게 식별할 수 있는 속성이다. 기본키와 유사하지만 NULL 값을 하나 허용한다는 차이가 있다. 예를 들어, 학생 테이블에서 '이메일' 필드는 각 학생마다 고유해야 하므로 고유키로 설정할 수 있다. 학생 중에 이메일이 없는 경우가 있을 수 있으므로 이메일 필드는 NULL 값을 하나 가질 수 있다.

외래키(Foreign Key)

외래키는 한 테이블의 필드가 다른 테이블의 기본키 또는 고유키와 연결되어 있는 관계를 나타냔다. 외래키를 통해 두 테이블 사이의 관계를 정의하고 데이터의 일관성을 유지할 수 있다. 예를 들어, '수강 신청' 테이블에서 '학번' 필드는 학생 테이블의 기본키인 '학번'을 외래키로 참조한다. 이를 통해 수강 신청 테이블의 각 행이 특정 학생을 참조하게 된다.

 


예시

아래 예시는 SQL을 사용하여 기본키(Primary Key), 슈퍼키(Super Key), 고유키(Unique Key), 외래키(Foreign Key)를 설명한다. 이 예시에서는 students 테이블과 course_registration 테이블을 사용하는 가정으로 만들었다.

기본키(Primary Key) 예시

기본키는 각 행을 고유하게 식별하는 데 사용된다. students 테이블에서는 student_id를 기본키로 지정할 수 있다.

CREATE TABLE students (
    student_id INT AUTO_INCREMENT,
    name VARCHAR(100),
    email VARCHAR(100),
    PRIMARY KEY (student_id)
);

슈퍼키(Super Key) 예시

슈퍼키는 테이블 내의 행을 고유하게 식별할 수 있는 하나 이상의 필드 집합이다. 예를 들어, student_idemail의 조합은 슈퍼키가 될 수 있지만, SQL에서는 직접 "슈퍼키"를 정의하는 구문이 없다. 슈퍼키는 개념적으로 이해하며 모든 슈퍼키 중 가장 적은 수의 필드로 구성된 것이 후보키가 된다.

고유키(Unique Key) 예시

고유키는 각 행을 고유하게 식별하지만, 기본키와 달리 NULL 값을 한 번 허용할 수 있다. email 필드를 고유키로 지정할 수 있다.

CREATE TABLE students (
    student_id INT AUTO_INCREMENT,
    name VARCHAR(100),
    email VARCHAR(100) UNIQUE,
    PRIMARY KEY (student_id)
);

외래키(Foreign Key) 예시

외래키는 한 테이블의 필드가 다른 테이블의 기본키나 고유키를 참조하는 경우 사용된다. course_registration 테이블에서 student_id 필드를 외래키로 사용하여 students 테이블의 student_id를 참조할 수 있다.

CREATE TABLE course_registration (
    registration_id INT AUTO_INCREMENT,
    student_id INT,
    course_name VARCHAR(100),
    PRIMARY KEY (registration_id),
    FOREIGN KEY (student_id) REFERENCES students(student_id)
);

 

이 예시에서 students 테이블은 학생들의 정보를 저장하고, course_registration 테이블은 각 학생이 등록한 과목의 정보를 저장한다. student_id 필드가 students 테이블과 course_registration 테이블을 연결하는 외래키로 작용한다.