DB 제약조건

allnight5·2023년 1월 12일
0
  • 제약 조건은 데이터의 무결성을 지키기 위해 제한하는 조건입니다.

    • 혼란스러운 상황
      • 같은 아이디가 회원으로 추가되면?
      • 회원이 탈퇴해서 멤버테이블에서 삭제 되었는데, 구매테이블에는 회원 아이디가 여전히 존재하면?
    • 데이터의 결함이 없는 상태인 무결성을 유지하기 위해 DBMS가 제공합니다.
  • 제약조건 종류
    - Primary Key 제약조건
    - Foreign Key 제약조건
    - Unique 제약조건
    - Check 제약조건
    - Default 정의
    - Null값 허용
    기본키 (Primary Key) 제약조건

create table member
( 	mem_id char(8) not null primary key,
		mem_name varchar(10) not null,
    height tinyint unsigned null
);

혹은

create table member
( 	mem_id char(8) not null primary key,
		mem_name varchar(10) not null,
    height tinyint unsigned null
);

alter table member add constraint primary key (mem_id);

외래 키(Foreign Key) 제약 조건

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)
);

member 테이블에서 mem_id(PK) 를 변경하거나, member를 삭제하면?

일대다 (PK-FK) 관계를 맺은 상태에서는 제약조건으로 오류를 발생 시킴

만약 에러가 발생 하지 않고 member 테이블의 ‘BLK’가 ‘PINK’로 변경 되었다면 어떻게 될까요? buy 테이블에는 여전히 mem_id가 ‘BLK’로 되어있어서 해당 열은 member 테이블을 참조 하지도 못하는 고아 신세가 됩니다. 데이터 무결성이 깨진 상태 입니다. 이렇게 데이터베이스는 무결성을 지키기 위해 제약조건을 발동시켜 오류를 발생 시킵니다. 데이터가 엉망이 되는것 보다 해당 쿼리를 동작하지 못하게 하는게 훨씬 좋으니까요.

  • ON UPDATE CASCADE, ON DELETE CASCADE
    • 회원 테이블의 아이디를 변경하면 구매 테이블의 아이디도 자동으로 변경되면 얼마나 편할까요? 이런 기능을 지원하는 것이 ON UPDATE CASCADE 이고, ON DELETE CASCADE은 회원 테이블의 데이터가 삭제 되면 참조 테이블의 데이터도 삭제되는 기능입니다.
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) 
    on update cascade 
    on delete cascade
);
  • 기타 제약 조건
    • 고유 키 제약 조건 - 중복되지 않는 유일한 값만 입력 가능
    • 체크 제약 조건 - 조건에 만족 되는 값만 입력 가능
    • 기본값 정의 - 값을 입력하지 않았을 때 자동으로 입력될 값을 미리 지정
    • 널 값 허용 - NULL or NOT NULL
drop table buy, member; -- 실습을 위해 테이블 모두 삭제

create table member
( 	mem_id char(8) not null primary key,
		mem_name varchar(10) not null,
    email char(30) null unique,
		height tinyint unsigned null check (height >= 100),
    phone1 char(3) default '02'
);
profile
공부기록하기

0개의 댓글