article thumbnail image
Published 2021. 7. 7. 15:12
728x90


 

제약조건

  • 컬럼에 저장될 데이터의 조건을 설정하는 것을 제약조건이라고 한다.
  • 제약 조건을 설정하면 조건에 위배되는 데이터는 저장할 수가 없으므로 데이터의 무결성을 보장할 수 있다.
  • 데이터베이스 내의 테이블들은 여러 개발자가 사용할 수 있으므로 테이블을 만들 때 제약 조건을 설정하는 것은 매우 중요하다.

 


 

 

- Primary key : 컬럼에 중복된 데이터를 저장할 수 없으며 null 값을 허용하지 않는다. 주로 각 로우를 구분하기 위한 유일한 값을 저장하는 컬럼에 사용한다. 기본키라고도 부른다.

 

- Foreign key : 특정 테이블의 primary key 컬럼에 저장되어 있는 값만 저장할 수 있도록 한다. 흔히 참조키, 외래 키라고 부르며 지정된 테이블의 기본키 컬럼을 참조하여 참조하는 기본키 컬럼에 저장되어 있는 값만 저장할 수 있다. null 값을 허용한다. 

 

- not null : 컬럼에 null값을 저장할 수 없으며 쿼리문을 통해 반드시 값이 지정되어야 한다.

 

- unique : 컬럼에 중복된 값을 저장할 수 없다. null은 허용한다.

 

- check : 값의 범위나 종류를 지정하여 조건에 맞는 값만 저장할 수 있도록 한다. check 제약조건은 MySQL에서 지원하지 않는다.

 

- defualt : null이 들어올 경우 기본 설정되는 값을 지정한다. defualt를 설정할 경우 컬럼에 null을 저장할 수 없다.

 

 

 


 

 

not null을 활용해 보기 위해 테이블을 만들고 실험해 보도록 하자

 

-- not null 사용해보기

-- 테이블 생성
create table test_table10(
data1 int not null
);
insert into test_table10 (data1) value (1);
insert into test_table10 (data1) value (2);
insert into test_table10 (data1) value (3);

-- 중복된 값 넣어보기
insert into test_table10 (data1) value (1);
select * from test_table10;

-- null값 넣어보기
insert into test_table10 (data1) value (null); -- 오류가 발생한다.

 

마지막 줄에서 오류가 발생하는 것을 확인할 수 있었다.

테이블을 만들 때 not null이라고 제약조건을 걸어 주었기 때문에 null값은 들어갈 수 없는 것이다.

 


 

Primary key를 활용해 보기 위해 테이블을 만들고 실험해 보도록 하자

 

-- data1을 기본키로 하는 테이블 생성
create table test_table20(
data1 int,
data2 int not null,
constraint pk1 primary key(data1)
);

insert into test_table20 (data1, data2) value (10, 100);
insert into test_table20 (data1, data2) value (20, 200);
insert into test_table20 (data1, data2) value (30, 300);

-- 기본키 컬럼에 중복된 값 넣어보기
insert into test_table20 (data1, data2) value (10, 100); -- 기본키 컬럼이 중복되었기 때문에 오류발생
insert into test_table20 (data1, data2) value (null, 100); -- 기본키 컬럼에 null값이 들어갔기 때문에 오류발생

 

역시 마지막 두 줄에서 오류가 발생한다

data1컬럼은 기본키인데 10이라는 값이 중복되었기 때문이다.

또한 기본키 컬럼에는 null값이 들어갈 수 없기 때문에 오류가 발생한다.

 


 

Foreign key를 활용해 보기 위해 테이블을 만들고 실험해 보도록 하자

 

-- test_table20의 data1컬럼을 참조하는 외래키를 가지고 있는 테이블 만들기

create table test_table30(
data1 int,
data2 int,
constraint pk2 primary key(data1),
constraint fk2 foreign key(data2) references test_table20(data1)
);

insert into test_table30 (data1, data2) value (1, 10);
insert into test_table30 (data1, data2) value (2, 20);
insert into test_table30 (data1, data2) value (3, 30);

insert into test_table30 (data1, data2) value (4, 40); -- 외래키 자리에 참조하는 data1컬럼에 없는 값을 넣었기 
-- 때문에 오류가 발생한다.
insert into test_table20 (data1, data2) value (5, null); -- null값은 허용한다.

 

마지막에서 두번째 줄에 test_table30의 data2컬럼은 test_table20의 data1컬럼을 참조하는데

test_table20의 data1컬럼에 없는 40이라는 값을 집어넣으려고 하니까 오류가 발생하게 된다.

하지만 null값은 넣을 수 있는 것을 확인할 수 있다.

 


 

Unipue를 활용해 보기 위해 테이블을 만들고 실험해 보도록 하자

-- unique한 컬럼을 가지는 test_table40 만들기

create table test_table40(
data1 int,
data2 int not null,
constraint uk1 unique(data1),
constraint uk2 unique(data2)
);

insert into test_table40 (data1, data2) value (1, 10);
insert into test_table40 (data1, data2) value (2, 20);
insert into test_table40 (data1, data2) value (3, 30);

insert into test_table40 (data1, data2) value (1, 30); -- 중복된 값을 넣었기 때문에 오류가 발생
insert into test_table40 (data1, data2) value (null, 50); -- null값은 허용한다.

 

마지막 두번째 줄에 data1컬럼에 이미 들어있는 1을 넣으려 하자 오류가 발생하였다.

data1은 not null은 아니므로 null값은 허용된다.

 


 

default를 활용해 보기 위해 테이블을 만들고 실험해 보도록 하자

-- data1과 data2에 default값을 설정해준다.
create table test_table50(
data1 int not null default 1,
data2 int not null default 10
);

insert into test_table50 (data1, data2) value (1, 10);
insert into test_table50 (data1, data2) value (2, 20);
insert into test_table50 (data1, data2) value (3, 30);

insert into test_table50 (data1, data2) value (null, null); -- 진짜 null을 넣으려 하기때문에 오류
insert into test_table50 (data1) value (1000); -- 값이 지정되지 않으므로 data2에 default값이 들어감
insert into test_table50 (data2) value (2000); -- 값이 지정되지 않으므로 data1에 default값이 들어감

 

 

 

 

 

 

 

 

'MySQL' 카테고리의 다른 글

MySQL 트랜젝션 관리  (0) 2021.07.07
MySQL 저장 수정 삭제  (0) 2021.07.07
MySQL 데이터 베이스 및 테이블 생성  (0) 2021.07.07
MySQL 서브쿼리(SUB QUERY)  (0) 2021.07.05
MySQL 조인(JOIN)  (0) 2021.07.05
복사했습니다!