수퍼 키(Super key), 후보 키(Candidate key), 기본 키(Primary key), 대체 키(Alternate key), 외래 키(Foreign key)
수퍼 키(super key)
한 릴레이션 내의 특정 tuple을 고유하게 식별하는 하나의 attribute 혹은 attribute들의 집합
ex) 신용카드 회사의 고객 relation에서 (신용카드번호, 주소) 혹은 (주민등록번호, 이름) 혹은 (주민등록번호)
tuple들을 고유하게 식별하는데 꼭 필요하지 않은 attribute들을 포함할 수 있음
https://jerryjerryjerry.tistory.com/49
후보 키(candidate key)
각 tuple을 고유하게 식별하는 최소한의 attribute들의 모임
ex) (신용카드번호, 주소)는 신용카드 회사의 고객 릴레이션의 후보 키가 아니지만 (신용카드번호)는 후보 키
모든 릴레이션에는 최소한 한 개 이상의 후보 키가 있음
후보 키도 두 개 이상의 attribute로 이루어질 수 있으며 이런 경우 복합 키(composite key)라고 부름
https://jerryjerryjerry.tistory.com/49
-> 학번, 이메일은 후보 키가 될 수 있음
-> 미래 언젠가 동명이인이 추가되면 이름은 더이상 고유해지지 않음 -> 후보 키가 될 수 없음
기본 키(primary key)
한 relation에 candidate key가 두 개 이상 있으면, 설계자 혹은 데이터베이스 관리자가 이들 중에서 하나를 기본 키로 선정
ex) 신용카드 회사의 고객 relation에서 신용카드번호와 주민등록번호가 후보 키가 될 수 있는데, 이 중에서 신용카드번호를 기본 키로 선정
자연스러운 기본 키를 찾을 수 없는 경우 -> 레코드 번호와 같이 종종 인위적인 key attribute를 relation에 추가
대체 키(alternate key)
기본 키가 아닌 후보 키
ex) 위의 경우에서 신용카드번호를 기본 키로 선정했으니, 주민등록번호는 대체 키
외래 키(foreign key)
어떤 relation의 기본 키를 참조하는 attribute
관계 데이터베이스에서 relation들 가의 관계를 나타내기 위해서 사용됨
외래 키 attribute는 참조되는 relation의 기본 키와 동일한 domain을 가져야 함(data type, 범위, 제한 조건 등)
자신이 속한 relation의 기본 키의 구성요소가 되거나 되지 않을 수 있음
외래 키의 유형
-> 수강 relation에서 학번, 과목번호는 각각이 외래 키 -> 두 외래 키가 합쳐져서 기본 키가 될 수 있음
2.4. 무결성 제약조건
데이터 무결성(data integrity)
데이터의 정확성 또는 유효성을 의미
일관된 데이터베이스 상태를 정의하는 규칙들을 묵시적으로 or 명시적으로 정의함
데이터베이스가 갱신될 때 DBMS가 자동적으로 일관성 조건을 검사 -> 응용프로그램들은 일관성 조건을 검사할 필요가 없음
도메인 제약조건(domain constraint)
각 attribute 값이 반드시 원자값이어야 함
attribute 값의 디폴트 값, 가능한 값들의 범위 등을 지정 가능
데이터 형식을 통해 값들의 유형을 제한, CHECK 제약 조건을 통해 값들의 범위를 제한 가능
SQL2는 도메인을 명시적으로 정의하는 것을 허용하지만, 오라클은 지원 X
키 제약조건(key constraint)
key attribute에 중복된 값이 존재해서는 안 됨
PRIMARY KEY
PRIMARY KEY 제약 조건을 설정하면, 해당 필드는 NOT NULL과 UNIQUE 제약 조건의 특징을 모두 가진다.
PRIMARY KEY를 명시하면, 해당 필드가 기본 키로 설정된다.
CREATE TABLE Persons (
ID int PRIMARY KEY,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
CREATE TABLE Persons (
ID int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int
);
기본 키가 각 tuple들을 식별하기 위해 사용되기 때문에, relation의 기본 키를 구성하는 어떤 attribute도 NULL값을 가질 수 없다는 제약조건 -> 널값을 가진 키가 2개면 둘을 구별할 수 없기 때문에, 기본 키는 널값을 가질 수 없다. 기본 키를 제외하고는 널값 가능
대체 키에는 적용되지 않음
사용자는 릴레이션을 생성하는 데이터 정의문에서 어떤 attribute가 relation의 기본 키의 구성요소인가를 DBMS에 알려줌
ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } -> 외래 키 지정시에 ON DELETE, ON UPDATE 옵션 지정 1. RESTRICT : 개체를 변경/삭제할 때 다른 개체가 변경/삭제할 개체를 참조하고 있을 경우 변경/삭제가 취소됩니다.(제한)
2. CASCADE : 개체를 변경/삭제할 때 다른 개체가 변경/삭제할 개체를 참조하고 있을 경우 함께 변경/삭제됩니다.
3. NO ACTION : MYSQL에서는 RESTRICT와 동일합니다.
4. SET NULL : 개체를 변경/삭제할 때 다른 개체가 변경/삭제할 개체를 참조하고 있을 경우 참조하고 있는 값은 NULL로 세팅됩니다.
5. SET DEFAULT : 개체를 변경/삭제할 때 다른 개체는 DEFAULT값으로 세팅됨
https://h5bak.tistory.com/125 [이준빈은 호박머리]
수정
DBMS는 수정하는 attribute가 기본 키인지 외래 키인지 검사함
수정하려는 attribute가 기본키도 아니고 외래 키도 아니면 -> 수정 연산이 참조 무결성 제약조건을 위배하지 않음
제한, 연쇄, 널값, 디폴트값 규칙이 수정 연산에도 적용됨
오라클에서는 수정 연산에 대해 제한적으로 참조 무결성 제약조건을 유지 -> 기본 키는 변경하면 안 된다는 철학