제약조건의 기본 개념과 종류
제약 조건 : 데이터의 무결성을 지키기 위해 제한하는 조건
데이터의 무결성 : ‘데이터에 결함이 없음’
MySQL에서 제공하는 제약조건
- PRIMARY KEY
- FOREIGN KEY
- UNIQUE
- CHECK
- DEFAULT
- NULL 값 허용
기본 키 제약조건
기본 키 (Primary key) : 데이터를 구분할 수 있는 식별자, 중복 X, NULL값 입력 X
기본키로 생성한 것은 자동으로 클러스터형 인덱스가 생성된다.
- CREATE TABLE 에서 생성하는 기본 키 제약조건
📌 열 이름 뒤에 PRIMARY KEY 를 붙여주기
USE naver_db;
DROP TABLE IF EXISTS buy, member;
CREATE TABLE member
( mem_id CHAR(8) NOT NULL PRIMARY KEY,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL
);
📌 제일 마지막 행에 PRIMARY KEY(열_이름)를 붙여주기
DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id CHAR(8) NOT NULL,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL
PRIMARY KEY (mem_id)
);
- ALTER TABLE 에서 설정하는 기본 키 제약조건
ALTER TABLE : 이미 만들어진 테이블을 수정하는 것
DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id CHAR(8) NOT NULL,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL
);
ALTER TABLE member
ADD CONSTRAINT
PRIMARY KEY (mem_id);
- 기본 키에 이름 지정하기
DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id CHAR(8) NOT NULL,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL,
CONSTRAINT PRIMARY KEY PK_member_mem_id (mem_id)
// 'PK가 member 테이블의 member_id 열에 지정됨'
외래 키 제약조건
외래 키 (Foreign key) : 두 테이블 사이의 관계 연결 → 데이터의 무결성 보장
외래 키가 설정된 열은 반드시 다른 테이블의 기본 키와 연결된다.
기본 키가 있는 테이블 : 기준 테이블 / 외래 키가 있는 테이블 : 참조 테이블
참조테이블이 참조하는 기준 테이블의 열은 반드시 기본 키나 고유 키로 설정되야 한다.
- CREATE TABLE 에서 설정하는 외래 키 제약조건
📌 CREATE TABLE 끝에 FOREIGN KEY 키워드를 설정하기
DROP TABLE IF EXISTS buy, member;
CREATE TABLE member
( mem_id CHAR(8) NOT NULL PRIMARY KEY,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL
);
CREATE TABLE buy
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
mem_id CHAR(8) NOT NULL,
prod_name CHAR(6) NOT NULL,
FOREIGN KEY(mem_id) REFERENCES member(mem_id)
);
-> 외래 키 형식 : FOREIGN KEY(열_이름) REFERENCES 기준_테이블(열_이름)
- ALTER TABLE 에서 설정하는 외래 키 제약조건
DROP TABLE IF EXISTS buy;
CREATE TABLE buy
( num INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
mem_id CHAR(8) NOT NULL,
prod_name CHAR(6) NOT NULL
);
ALTER TABLE buy
ADD CONSTRAINT
FOREIGN KEY(mem_id)
REFERENCES member(mem_id);
PK-FK 관계가 설정되면 기준 테이블의 열은 변경되거나 삭제되지 않는다.
→ 기준 테이블의 열 이름이 변경될 때 참조 테이블의 열 이름이 자동으로 변경된다면??
→ ON UPDATE CASCADE 문 사용하기
ON UPDATE CASCADE 문
ON UPDATE CASCADE
ON DELETE CASCADE
기준 테이블의 데이터가 삭제되면 참조 테이블의 데이터도 삭제되는 기능이다.
고유 키 제약조건
고유 키(Unique) : 중복되지 않는 유일한 값을 입력해야 하는 조건
📌 NULL 값 허용, 여러 개 설정 가능
- email 값에 중복된 데이터 입력해보기
DROP TABLE IF EXISTS buy, member;
CREATE TABLE member
( mem_id CHAR(8) NOT NULL PRIMARY KEY,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL,
email CHAR(30) NULL UNIQUE
);
INSERT INTO mamber VALUES('BLK', '블랙핑크', 163, 'pink@gmail.com');
INSERT INTO member VALUES('TWC', '트와이스', 167, NULL);
INSERT INTO member VALUES('APN', '에이핑크', 164, 'pink@gmail.com');

-> 중복되는 값이 있기 때문에 오류가 발생한다. (Action Output line 90)
체크 제약조건
체크 제약조건 : 입력되는 데이터를 점검하는 기능이다.
열의 정의 뒤에 CHECK(조건) 을 추가한다.
DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id CHAR(8) NOT NULL PRIMARY KEY,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL CHECK (height >= 100 ),
phone CHAR(3) NULL
);
// CHECK 조건을 위반하는 데이터를 포함해 입력
INSERT INTO member VALUES('BLK', '블랙핑크', 163, NULL);
INSERT INTO member VALUES('TWC', '트와이스', 99, NULL);

-> CHECK 조건을 위반했다는 오류가 발생한다.
📌 테이블을 만든 뒤 ALTER TABLE 문으로 CHECK 제약조건 추가하기
ALTER TABLE member
ADD CONSTRAINT
CHECK (phone1 IN ('02', '031', '032', '054', '055', '061'));
// CHECK 조건을 위반하는 데이터를 포함해 입력
INSERT INTO member VALUES('TWC', '트와이스', 167, '02');
INSERT INTO member VALUES('OMY', '오마이걸', 167, '010');

-> CHECK 조건을 위반했다는 오류가 발생한다.
기본 값 정의
기본 값 (Default) 정의 : 값을 입력하지 않았을 때 자동으로 입력될 값을 미리 지정하는 것이다.
DROP TABLE IF EXISTS member;
CREATE TABLE member
( mem_id CHAR(8) NOT NULL PRIMARY KEY,
mem_name VARCHAR(10) NOT NULL,
height TINYINT UNSIGNED NULL DEFAULT 160,
phone1 CHAR(3) NULL
);
- ALTER TABLE 사용시 ALTER COLUMN 문을 사용해 DEFAULT 지정
ALTER TABLE member
ALTER COLUMN phone1 SET DEFAULT '02';
- 기본값이 설정된 열에 기본값을 입력하려면 default 라고 작성하기
INSERT INTO member VALUES('RED', '레드벨벳', 161, '054');
INSERT INTO member VALUES('SPC', '우주소녀', default, default);
SELECT * FROM member;

-> default 로 작성한 부분이 기본 값으로 출력된 것을 확인할 수 있다.
'Language > SQL' 카테고리의 다른 글
| [MySQL] 인덱스의 개념을 알아보자 (0) | 2024.08.21 |
|---|---|
| [MySQL] 가상의 테이블인 뷰(View)에 대해 알아보자 (0) | 2024.08.21 |
| [MySQL] SQL 프로그래밍 (4) | 2024.08.21 |
| [MySQL] 두 테이블을 묶는 조인(JOIN)에 대해 알아보자 (0) | 2024.08.21 |
| [MySQL] 변수와 형변환 (0) | 2024.08.21 |