본문 바로가기
DB/MySQL

[MySQL] 제약조건

by oda 2023. 2. 8.

제약 조건(Constraint)

- 데이터의 무결성을 지키기 위한 제한된 조건을 의미한다.

- 특정 데이터를 입력 시 어떠한 조건을 만족했을 때에 입력되도록 제약한다.

ex) 동일한 아이디로 다시 회원 가입이 안되는 것

 

데이터 무결성을 위한 제약조건 

  • PRIMARY KEY 제약 조건
  • FOREIGN KEY 제약 조건
  • UNIQUE 제약 조건
  • CHECK 제약 조건(MySQL 8.0.16부터 지원)
  • DEFAULT 정의
  • NULL 

기본키(Primary Key) 제약조건

- 테이블에 존재하는 많은 행의 데이터를 구분할 수 있는 식별자

- 중복이나 NULL 값이 입력될 수 없다.

- 기본키로 생성한 것은 자동으로 클러스터형 인덱스를 생성한다.

- 테이블에서 기본키를 하나 이상 열에 설정할 수 있다.

drop table if exists userTbl; -- 이미 테이블이 있다면 삭제
create table userTbl(
	userId char(8) not null,
    name varchar(10) not null,
    birthYear int not null,
    constraint primary key PK_userTbl_userId(userId) -- userId를 기본키로하고 이름을 직접 지정할 수 있다.
);

 

기본키 생성

/* 가장많이 사용하는 방법, 테이블 생성시 컬럼에 직접 지정*/
create table userTbl(
	userId char(8) not null primary key,
    name varchar(10) not null,
    birthYear int not null
);
/* 테이블 생성시 따로 지정*/
create table userTbl(
	userId char(8) not null,
    name varchar(10) not null,
    birthYear int not null,
    constraint primary key PK_userTbl_userId(userId) -- userId를 기본키로하고 이름을 직접 지정할 수 있다.
);
/* 테이블 생성시 기본키를 설정하지 않은경우 - 따로 지정 */
create table userTbl(
	userId char(8) not null,
    name varchar(10) not null,
    birthYear int not null
); -- 기본키 지정안한 테이블

-- 테이블 수정을 통해 기본키 설정
alter table usertbl-- alter table: 테이블 수정
	add constraint primary key PK_usertbl_userId(userId); -- 기본키 추가
show keys from userTbl;
/* 여러 컬럼을 기본키로 설정 */
drop table if exists prodTbl;
create table prodTbl
(
	prodCode char(3) not null,
    prodId char(3) not null,
    prodDate datetime not null,
    prodCur char(10) null
);
desc prodTbl;

alter table prodTbl
	add constraint PK_prodtbl_prodCode_ProdId
		primary key(prodCode, prodId); -- prodCode 컬럼과 prodId컬럼을 합쳐서 기본키로 설정
        
show keys from prodTbl; -- show index from prodTbl;과 동일한 결과 (기본키 확인가능)

외래키(Foreign Key) 제약조건

- 두 테이블 사이의 관계를 선언하여 데이터의 무결성을 보장해 주는 역할을 한다.

- 외래 키 관계를 설정하면 하나의 테이블이 다른 테이블에 의존하게 된다.

- 외래 키 테이블이 참조하는 기준 테이블의 열은 반드시 Primary Key이거나 Unique 제약조건이 설정되어 있어야 한다.

- 외래 키의 옵션 중 ON DELETE CASCADE 또는 ON UPDATE CASCADE기준테이블의 데이터가 변경(삭제/수정) 되었을 때 외래키 테이블도 자동으로 적용되도록 하는 옵션이다.

 

 

외래키 생성

/* 테이블 생성시 외래키 설정*/
create table buyTbl
(
	num int auto_increment not null primary key,
    userId char(8) not null,
    prodName char(6) not null,
    foreign key (userId) references userTbl(userId) -- buyTbl.userId와 userTbl.userId 관계를 맺음
);
/* 테이블 생성 후 외래키 별도 설정 */
create table buyTbl
(
	num int auto_increment not null primary key,
    userId char(8) not null,
    prodName char(6) not null
);
alter table buytbl
	add constraint FK_userTbl_buyTbl -- 제약조건 이름 설정
    foreign key(userId) -- 외래키 지정 컬럼 선택
    references userTbl(userId); -- 참고 테이블 컬럼 선택

UNIQUE 제약조건

- 중복되지 않는 유일한 값을 입력해야하는 조건이다.

- PRIMARY KEY 와 비슷하지만 UNIQUE는 NULL값을 허용한다는 점에서 다르다.

- 사용자의 email정보 등을 입력받을 때 설정한다. (중복은되지 않아야하지만 null은 허용될 때)

 

UNIQUE 설정

/* 테이블 생성시 unique 설정*/
create table userTbl(
	userId char(8) not null primary key,
    name varchar(10) not null,
    birthYear int not null,
    email char(30) null unique -- 컬럼에 직접 unique 제약조건을 설정한다.
);
/* 테이블 생성 시 컬럼과 별도로 unique 설정*/
create table userTbl(
	userId char(8) not null primary key,
    name varchar(10) not null,
    birthYear int not null,
    email char(30) null,
    constraint AK_email unique (email) -- constraint 키이름 unique (컬럼)
);

CHECK 제약조건

- 입력되는 데이터를 점검하는 기능이다.

- ALTER TABLE문으로 제약조건을 추가할 수 있다.

/* 테이블 생성시 컬럼 옆에 check문 으로 설정*/
create table userTbl(
	userId char(8) not null primary key,
    name varchar(10),
    mobile char(3) null,
    birthYear int check (birthYear >= 1900 and birthYear <= 2023), -- birthYear이 1900~2023까지만 입력가능하도록 설정
    constraint CK_name check (name is not null) -- 이름에 null이 들어가지 않도록 설정
);

/* 테이블 생성 후 check 제약조건 추가 */
alter table userTbl
	add constraint CK_mobile
    check (mobile in ('010','011','016','017','108','109'));

DEFAULT 정의

- 값을 입력하지 않았을 때 자동으로 입력되는 기본 값을 정의한다.

- ALTER TABLE 사용시 컬럼에 DEFAULT를 지정하기 위해서는 ALTER COLUMN문을 사용해야한다.

 

DEFAULT 설정

/* 테이블 생성시 DEFAULT 설정 */
create table usertbl
(
	userId char(8) not null primary key,
    name varchar(10) not null,
    birthYear int not null default -1, -- 입력 안하면 -1이 입력됨
    addr char(2) not null default '서울', -- 입력 안하면 서울이 입력됨
    mobile1 char(3) null,
    mobile2 char(3) null,
    height smallint null,
    mDate date null
);
/* 테이블 생성 후 ALTER TABLE 문을 통해 DEFAULT 설정 */
create table usertbl
(
	userId char(8) not null primary key,
    name varchar(10) not null,
    birthYear int not null, -- 입력 안하면 -1이 입력됨
    addr char(2) not null, -- 입력 안하면 서울이 입력됨
    mobile1 char(3) null,
    mobile2 char(3) null,
    height smallint null,
    mDate date null
);

alter table usertbl
	alter column birthYear set default -1;
alter table usertbl
	alter column addr set default '서울';
alter table usertbl
	alter column height set default 170;

Null

- NULL 값을 허용하려면 NULL을, 허용하지 않으려면 NOT NULL을 사용한다.

- PRIMARY KEY가 설정된 컬럼에는 자동으로 NOT NULL로 설정된다.

- NULL 값은 ‘아무 것도 없다’라는 의미로 공백(‘ ‘) 이나 0과 다르다.

 

 

'DB > MySQL' 카테고리의 다른 글

[MySQL] ALTER TABLE (테이블 수정)  (0) 2023.02.08
[MySQL] 내장함수  (0) 2023.02.07
[MySQL] 사용자 관리  (0) 2023.02.03
[MySQL] MySQL WorkBench -SQL 단축키  (0) 2023.02.02

댓글