MySQL은 데이터의 무결성을 위해서 다음의 6가지의 제약 조건을 제공한다.
PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, DEFAULT, NULL
PRIMARY KEY
데이터베이스 테이블에서 각 행을 유일하게 식별하기 위해 사용하는 제약 조건
주요 특성
- 각 행을 고유하게 식별해야 함. 즉, 중복된 값을 가질 수 없음
- 널 값 (NULL) 불가. 항상 NOT NULL이 같이 와야 함
- 각 테이블에는 하나의 PRIMARY KEY만 설정할 수 있음
- 자동으로 인덱스를 생성하여 검색 성능을 향상
FOREIGN KEY
데이터베이스에서 두 테이블 간의 관계를 정의하는 제약 조건. FOREIGN KEY는 한 테이블의 열이 다른 테이블의 PRIMARY KEY 또는 UNIQUE 열을 참조하도록 설정한다.
주요 특성
- 두 테이블 간의 관계를 유지하며, 참조 무결성을 보장
- 부모 테이블의 해당 열에 존재하는 값만을 가질 수 있음
UNIQUE
중복되지 않는 유일한 값을 입력해야 하는 조건이다. PRIMARY KEY와 거의 비슷하며 차이점은 NULL값을 허용한다는 점이다. NULL은 여러 개가 입력되어도 상관없다. 회원 테이블의 예를 든다면 주로 email 주소를 UNIQUE로 설정하는 경우가 많다.
CHECK
입력되는 데이터를 점검하는 기능이다. 키 열에 마이너스 값이 들어올 수 없게 한다든지, 출생 연도가 100년 이후이고 현재 시점 이전이어야 한다든지 등의 조건을 지정할 수 있다.
CREATE TABLE usertbl
(userID CHAR(8) NOT NULL PRIMARY KEY,
name VARCHAR(10),
birthYear INT CHECK (birthdYear >= 1900 AND birthYear <= 2024),
mobile1 CHAR(3) NULL,
CONSTRAINT CK_name CHECK (name IS NOT NULL));
ALTER TABLE usertbl
ADD CONSTRAINT CK_mobile1
CHECK (mobile1 IN ('010', '011', '016', '017', '018', '019'));
DEFAULT
값을 입력하지 않았을 때 자동으로 입력되는 기본 값을 정의하는 방법
예) 출생 연도를 입력하지 않으면 -1을 입력하고, 주소를 특별히 입력하지 않았다면 '서울'이 입력되며, 키를 입력하지 않으면 170이라고 입력되도록 해보자.
birthYear INT NOT NULL DEFAULT -1,
addr CHAR(2) NOT NULL DEFAULT '서울',
height INT NOT NULL DEFAULT 170
제약 조건을 재설정하는 방법
제약 조건을 재설정하는 방법은 이미 만들어진 테이블을 수정하는 ALTER TABLE 구문을 사용하는 것이다.
DROP TABLE IF EXISTS usertbl;
CREATE TABLE usertbl
(userID CHAR(8) NOT NULL,
name VARCHAR(10) NOT NULL,
birthYear INT NOT NULL);
ALTER TABLE usertbl
ADD CONSTRAINT PK_usertbl_userID -- 제약 조건을 추가하자. 추가할 제약 조건 이름은 PK_usertbl_userID
PRIMARY KEY (userID); -- 추가할 제약 조건의 기본 키 제약 조건. 제약 조건을 설정할 열은 userID
제약 조건 이름
제약 조건 이름을 설정하는 것은 선택 사항이며, 기본적으로 제약 조건 이름을 명시하지 않는 경우가 많다. 제약 조건을 생성할 때 이름을 명시하지 않으면 데이터베이스 시스템이 자동으로 제약 조건 이름을 생성한다. 자동 생성된 이름은 식별하기 어려울 수 있으므로, 제약 조건을 명확하게 관리하고 유지보수하기 위해서 제약 조건 이름을 명시적으로 설정하는 것이 좋다.
'Database > MySQL' 카테고리의 다른 글
| [MySQL] 내부 함수 - 시스템 정보 함수 (0) | 2024.09.11 |
|---|---|
| [MySQL] 내장 함수 - 날짜 및 시간 함수 (0) | 2024.09.11 |
| [MySQL] 내장 함수 - 수학 함수 (0) | 2024.09.11 |
| [MySQL] 공통 테이블 식 (0) | 2024.09.10 |
| [MySQL] 서브 쿼리 (0) | 2024.09.10 |