Programming/SQL

[SQL] 제약조건 (not null / unique / primary key / foreign key / check/테이블수준 제약조건)

reeme 2020. 12. 16. 12:56

데이터 무결성

not null null값 허용안함 (중복은 허용)
예) 학생 테이블에서 학생의 이름은 null값일 수 없음
unique 하나의 테이블내에서 한번만 나옴
주로 대체키 설정 시 사용됨
primary key 기본키 : unique + not null
foreign key 외래키
check 도메인 무결성

제약 조건의 설정

테이블 만들때 속성에 제약조건 지정하기

CREATE TABLE 테이블명

  ( 속성명 속성타입 [ [ 제약조건명 ] 제약조건 ] ,

  속성명 속성타입 ,

  …     

  )

id int CONSTRAINT PK_01 PRIMARY KEY
name varchar(20) NOT NULL

 

제약조건 위반 튜플 삽입 예

create table customer (

id varchar(30) primary key,

....

)

insert into customer values(null, '2222', 'lee','010','1234567',1979,'seoul');

-- primary key인 id값을 null값으로 주었기 때문에 위반됨.

 


참조 무결성 제약 조건(외래키)

외래키 값은 다른 테이블의 기본키 값들 중에 하나여 함

속성명 [CONSTRAINTS 제약조건명 ] REFERENCE 참조테이블명 ( 속성명 )

예)  사원 테이블의 부서번호는 부서 테이블의 기본키 값들 중 하나이어야 함

     회원탈퇴를 했을때 그동안 썼던 글도 삭제를 시킬것이다 - > 외래키 설정 

참조 무결성 설정 및 삽입 오류의 예

먼저 부모테이블과 자식테이블 설정 

create table department5(
  	id varchar(20) primary key,
	deptname varchar(20) not null,
	code char(13) not null unique key
);

create table employee5(
  	id varchar(20) primary key,
	name varchar(20) not null,
	code char(13) not null unique key,
	dept_id varchar(20),
	foreign key (dept_id) references department5(id)
);

둘을 외래키로 연결해줌
employee5 테이블 가장 마지막줄
employee5테이블의 dept_id 와 department5테이블의 id로 연결된것을 알 수 있음

 

department5 테이블에 튜플 삽입

insert into department5 values('abcd','환경부','d548e');

-- 전체 속성에 넣을거면 속성명 생략 가능

employee5 테이블에 튜플 삽입

insert into employee5 values('wwww','seri','d548e','cdef');

-- 삽입불가능

-- 이유 : department5 테이블의 id 값과 employee5 테이블의 dept_id값이 같아야함

-- 'abcd'=/='cdef'

 

insert into employee5 values('wwww','seri','d548e','abcd');

-- 이렇게 둘을 같게 설정해주면 튜플 삽입이 가능해짐.

 

on update cascade : 참조키가 업데이트 되면 외래키도 업데이트한다 

on delete cascade : 참조키가 삭제되면 외래키도 삭제한다

create table board(
no int auto_increment primary key,
content varchar(1000),
id varchar(10),
foreign key(id) references membership(id) on update cascade on delete cascade 
);

 


check 제약조건 (컬럼부분에서  제약조건을 설정하는 방법)

도메인 무결성 제약조건

입력값의 제한을 두는 조건 . 범위 이외의 값이 들어오면 수행하지않게 막는다.

create table domaincon(
id varchar(20) primary key,
password varchar(30),
age int check(age>=19)
);
insert into domaincon(id,password, age) values ('abcd', '1234',20); -- 튜플 삽입 가능
insert into domaincon(id,password, age) values ('aaaa', '1234',15); -- 튜플 삽입 불가능 : 19세 미만이라서 안됨 

 


테이블 수준 제약조건 (컬럼부분이 끝난 뒤 마지막에 제약조건을 설정하는 방법)

속성 단위로 제약조건 설정은 표현에 있어서 제약이 따름

-- 예를들어 복합키의 경우 ( 여러개 속성이 합쳐져서 키가 됨 ) 등 

create table 테이블명 (

속성명 속성타입 

....

[constraint제약조건명] 제약조건 (속성명)

)

 

테이블 수준 제약조건 설정의 예

create table customer5(
name varchar(20),
phone varchar(11),
birthday datetime,
address varchar(100)
constraint customer 3_combo_pk primary key (name,phone)
);

 

 

 

주의)  sql문을 쓸때 콤마 위치 꼭 잘 확인할것