Lsiron

제약 조건과 키 본문

데이터베이스/MySQL

제약 조건과 키

Lsiron 2024. 7. 9. 00:20

제약 조건 (Constraints)

제약 조건이란? 데이터베이스 테이블에서 데이터의 무결성(Integrity)과 일관성(Consistency)을 유지하기 위해 사용되는 규칙이다.

 

제약 조건을 통해 데이터베이스에 저장될 수 있는 데이터의 유형과 관계를 정의할 수 있다.

 

제약 조건은 테이블을 생성할 때 또는 테이블이 생성된 후에 추가할 수 있다.

 

즉, 테이블에 잘못된 데이터가 입력되는 것을 방지하기 위한 규칙이라고 할 수 있다.

 

제약 조건의 종류와 사용 시기

1. NOT NULL : 컬럼에 NULL 값을 허용하지 않는다.

데이터를 입력하지 않으면 에러가 발생하고, 아무것도 명시하지 않는 경우 default 값은 NULL 값을 허용한다.

 

- 사용 시기: 특정 컬럼이 항상 값을 가져야 하는 경우.

- 예시: 사용자 테이블의 이메일 주소 컬럼은 NULL이 될 수 없다.

email VARCHAR(100) NOT NULL

 

2. UNIQUE: 컬럼의 모든 값이 고유해야 한다. 즉, 중복되는 값을 비허용 한다.

똑같은 값이 있다면 에러가 발생하고, NULL 값은 비교가 불가능하여 중복되어도 에러가 발생하지 않는다.

 

- 사용 시기: 중복된 값을 허용하지 않으려는 경우.

- 예시: 사용자 테이블의 사용자 이름 컬럼은 고유해야 한다.

username VARCHAR(50) UNIQUE

 

3. DEFAULT: 컬럼의 기본값을 설정한다.

아무런 값을 지정하지 않으면 DEFAULT 값으로 설정된다.

 

- 사용 시기: 값이 명시적으로 입력되지 않을 때 기본값을 제공하려는 경우.

- 예시: 제품 재고는 기본값으로 0을 설정한다.

stock INT DEFAULT 0

 

4. CHECK (MySQL 8.0 이상 지원): 컬럼의 값이 특정 조건을 만족해야 한다.

값의 범위를 제한하여 특정 값만 허용하고 제한한 값이 아닌 경우 에러가 발생한다.

 

- 사용 시기: 특정 비즈니스 규칙을 컬럼에 적용하려는 경우.

- 예시: 직원의 나이는 18 이상이어야 한다.

age INT CHECK (age >= 18)

 

5. CONSTRAINT (제약 조건 정의): 제약조건의 이름과 함께 제약조건을 정의할 수 있다.

단, NOT NULL 과 DEFAULT는 CONSTRAINT로 정의 할 수 없다.

생성된 제약 조건 확인 : 'SELECT * FROM information_schema.table_constraints'

 

- 사용 시기: 제약 조건의 이름을 지정하면 나중에 해당 제약 조건을 쉽게 식별하고 수정하거나 삭제할 수 있다.

CREATE TABLE users (
    id INT,
    email VARCHAR(100),
    CONSTRAINT uc_user_email UNIQUE (email)
);

 

6. 제약 조건 추가: CONSTRAINT로 만든 제약조건을 추가하는 방법이다.

--제약 조건 추가 : ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 제약조건(속성)
ALTER TABLE customer
ADD CONSTRAINT address_unique UNIQUE (address);

-- DEFAULT 제약 조건 수정: ALTER TABLE 테이블명 ALTER 속성 SET DEFAULT 기본값
ALTER TABLE customer
ALTER address SET DEFAULT '주소 없음'

 

7. 제약 조건 삭제: CONSTRAINT로 만든 제약조건을 삭제하는 방법이다.

-- ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름
ALTER TABLE 
container DROP CONSTRAINT customer_chk_2;

-- DEFAULT 제약 조건 삭제: ALTER TABLE 테이블명 ALTER 속성 DROP DEFAULT
ALTER TABLE customer
ALTER address DROP DEFAULT;

 

 

키 (Keys)

키는 데이터베이스 테이블에서 데이터를 고유하게 식별하거나 효율적으로 검색하기 위해 사용되는 컬럼 또는 컬럼의 집합이다. 키는 데이터베이스의 구조와 데이터 무결성을 유지하는 데 중요한 역할을 한다.

 

키는 조건에 만족하는 튜플을 찾거나, 정렬할 때 기준이 되는 속성이다.

 

키의 종류와 사용 시기

1. PRIMARY KEY(기본 키): 테이블 내에서 각 행을 고유하게 식별한다. 한 테이블에 하나만 존재할 수 있다.

서로 다른 튜플을 유일하게 식별할 수 있는 기준이 되는 속성이다. 중복되는 값을 가질 수 없고, NULL 값을 가질 수 없다.

테이블 당 1개만 설정할 수 있다.

 

- 사용 시기: 각 행을 고유하게 식별할 필요가 있는 경우.

- 예시: 사용자 테이블의 사용자 ID 컬럼

CREATE TABLE customer (
	id VARCHAR(10) PRIMARY KEY,
	name VARCHAR(10),
	address VARCHAR(30)
);

 

2. FOREIGN KEY(외래키): 다른 테이블의 기본 키를 참조하여 테이블 간의 관계를 설정한다.

참조되는 테이블의 기본키에 없는 값은 지정할 수 없다.

 

- 사용 시기: 두 테이블 간의 참조 무결성을 유지하려는 경우.

- 예시: 주문 테이블의 사용자 ID는 사용자 테이블의 사용자 ID를 참조한다.

CREATE TABLE order_history (
	customer_id VARCHAR(10),
	order_id VARCHAR(14),	
	-- 외래키 설정: FOREIGN KEY (참조할 속성) REFERENCES 참조되는 테이블(참조되는 속성)
	FOREIGN KEY (customer_id) REFERENCES customer(id),
	CONSTRAINT order_history_pk PRIMARY KEY (customer_id, order_id)
);

 

3. CANDIDATE KEY(후보키): 후보키는 테이블에서 각 행을 고유하게 식별할 수 있는 하나 이상의 속성(컬럼)으로 구성된 키이다 .

테이블에서 고유성과 최소성을 만족하는 모든 키들을 후보키라고 한다.

 

하나의 테이블에는 여러 후보키가 존재할 수 있다.

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

 

이 예시에서 student_id, ssn, email은 모두 고유성과 최소성을 만족하므로 후보키가 될 수 있다.

 

4. ALTERNATE KEY(대체키): 대체키는 후보키 중에서 기본 키(Primary Key)로 선택되지 않은 키를 말한다.

테이블에서 기본 키로 선택되지 않은 후보키들은 모두 대체키로 간주된다.

 

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

 

이 예시에서 student_id가 기본 키로 선택되었기 때문에, ssn과 email은 대체키로 간주된다.

 

5. SUPER KEY(슈퍼키): 슈퍼키는 테이블 내에서 각 행을 고유하게 식별할 수 있는 하나 이상의 속성(컬럼)으로 구성된 키이다.

슈퍼키는 고유성을 만족하지만 최소성을 만족하지 않을 수도 있다.

 

모든 후보키와 기본 키는 슈퍼키에 포함된다.

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,
    ssn VARCHAR(11),
    email VARCHAR(100),
    name VARCHAR(100),
    department_id INT
);

 

 

이 예시에서 employee_id는 슈퍼키이다.

 

employee_id와 email의 조합, ssn과 email의 조합도 슈퍼키가 될 수 있다.

 

 

 

 

무결성 제약 조건

- 개체 무결성: 기본키는 NULL 값과, 중복된 값을 가질 수 없다. (NOT NULL + UNIQUE)

- 참조 무결성: 외래키는 NULL 이거나 참조되는 RELATION의 기본키 값과 동일하다.

 

- 도메인 무결성: 특정 속성값은 그 속성이 정의된 도메인에 속한 값이어야 한다.

 => 주소에 서울시~, 경기도~ 는 되지만 뉴욕 은 안된다.

 

- NULL 무결성: 특정 속성값은 NULL 값을 가질 수 없다.

 => 반드시 받아야 하는 데이터는 반드시 NOT NULL 제약조건을 추가해야한다.

 

- 고유 무결성: 각 튜플이 가지는 속성값들은 서로 달라야 한다.

 => 하나의 테이블 안에서는 모든 튜플들이 절대 똑같은 데이터가 있어선 안된다. ( 기본키로 인해 지킬 수 있음 )

 

- 키 무결성: 테이블에 최소 한 개 이상의 키가 존재한다.