💙 들어가며
테이블에 데이터를 올바르게 입력하기 위한 제약조건에 대해서 배워보자.
✏️ 학습내용 정리
#도메인(domain) 제약조건: 컬럼단위
💡 도메인(domain)이란?
어떤 변수(변량, 필드, 속성, 컬럼..)에 들어가는 유효한 값의 범위를 의미한다.
원자성(하나의 값을 가진다)을 가지고 있어야 한다.
도메인 단위의 제약조건이다. 여기서는 컬럼단위의 제약조건을 가리킨다.
하나의 컬럼에 입력할 수 있는 자료형을 지정하는 것도 기본적인 도메인 제약조건에 해당한다고 볼 수 있다.
구체적으로 도메인 제약조건이라고 하는 것은 무엇이 있을까?
1. NOT NULL 제약조건
컬럼 중에서 필수 컬럼에 해당되는 녀석에는 반드시 값을 넣어야 하는 제약조건이다.(NULL값이 없음)
💡 NOT NULL
CREATE TABLE persons(
ID int NOT NULL,
LastName varchar(255) NOT NULL
)
TIP) 만약 제약조건을 이미 만들어진 테이블에 추가하는 방법으로 수정하고 싶다면
기존에 가지고 있던 레코드들 중에 NULL값이 들어간 것들을 다 수정한 뒤에야 적용할 수 있다.
2. default 제약조건
사용자쪽에서 직접 입력하지 않아도 기본값을 가지게 설정하는 제약조건이다. (NULL값이 아니게 할 수 있다.)
NOT NULL에 체크하고 default값에 따로 값을 입력해두면 된다.
(EX) 등록일자 컬럼의 default값으로 now()나 current_timestamp()를 넣어서
사용자가 입력하지 않아도 자동으로 기본값을 가지게 설정한다.
3. check 제약조건★
형식에 맞는 형태로 값을 넣을 수 있게 형식을 지정해주는 제약조건이다.
TIP) MYSQL은 체크제약조건을 UI로 넣을 수 없기 때문에 쿼리로 입력해야 한다.
이미 테이블이 만들어져 있다면 다음과 같이 추가할 수 있다.
💡 check 제약조건 추가하기
-- chk_price는 제약조건의 이름이다.
-- CHECK()안에 조건이 들어간다.
ALTER TABLE T1 ADD CONSTRAINT chk_price CHECK(price>0);
--정규식을 이용해서 제약조건을 추가할 수 있다.
--CHECK(컬럼명 rlike 정규식)을 사용한다.
--역슬래시 앞에는 역슬래시를 하나 더 써줘야 한다.
ALTER TABLE T1 ADD CONSTRAINT chk_phone CHECK(phone rlike '^01[016-9]-\\d{3,4}-\\d(4}$'
TIP) mariadb에서 테이블명이 예약어로 인식되는 경우에는 백틱(`)을 사용한다.
#엔티티(Entity) 제약조건: 테이블단위
각각의 컬럼에는 데이터가 잘 들어갔지만, 전체 테이블 단위로 보았을 때는 중복된 레코드가 들어갈 수 있다.
이런 중복된 레코드가 없도록 제한하는 제약조건을 확인해보자.
1. primary key 제약조건
테이블끼리 서로 식별할 수 있는 키로서 역할한다. NULL이어서도 안되고, 중복이 되어서도 안된다.
💡 member 테이블의 email을 primary key로 추가하기
ALTER TABLE `member` ADD PRIMARY KEY (email);
2. unique 제약조건
테이블을 식별하는 키로 사용되지는 않지만 중복되어서는 안되는 내용이 있다면 unique로 설정한다.
식별키인 id와 별개로 로그인아이디도 중복되어서는 안되기 때문에 로그인 아이디에 uq(unique)를 지정할 수 있다.
#관계 제약조건(외래키 제약조건): 관계단위
도메인, 엔티티 제약조건을 통해서 얻은 레코드가 있을 때,
레코드 각각에는 결함이 없지만 관계에서 확인해보면 결함이 있는 경우가 있다.
(관계를 맺게 하는 외래키를 가지고 제약한다고 해서 외래키 제악조건이라고도 한다.)
그런 경우에 관계 제약을 할 수 있으며, 참조키를 가지고 있는 자식쪽에서 제약을 건다.
또한 이런 옵션도 줄 수 있다.
부모가 수정되었을 때 자식에게도 영향이 가게 할 것인가?에 대한 것이다.
💡 MYSQL에서 Foreign Key Options
On Update: CASCADE (부모가 수정되면 다 수정되게 할 수 있다.)
On Delete: NO ACTION (부모가 삭제되었을 때는 아무런 ACTION도 하지 않겠다.)
※ Delete할 때 CASCADE하면 자식까지 다 삭제되므로 조심하기..!
💙 마치며
1.
제약조건을 추가하려고 할 때 기존 데이터가 있다면,
기존 데이터가 제약조건을 어기고 있지는 않은지 확인해야 한다.
만약 기존 데이터가 제약조건에 걸리면
제약조건은 추가되지 않는다.
2.
MYSQL에서는 자동커밋을 한다.
그래서... 주의가 필요하니.. 해제해놓는 것도 좋을듯..!
'SQL' 카테고리의 다른 글
[뉴렉처 6기]가변길이 배열 │컬렉션│Object│제네릭(230829) (0) | 2023.08.29 |
---|---|
[뉴렉처 6기] Maven 프로젝트│예외처리(230828) (0) | 2023.08.28 |
[뉴렉처 6기] DATABASE│정규화│1NF│2NF│3NF(230824) (0) | 2023.08.24 |
[뉴렉처 6기] DATABASE│식별키│식별관계/비식별관계(230822) (0) | 2023.08.22 |
[뉴렉처 6기] Oracle SQL│VIEW│DATE DICTIONARY│PL-SQL (0) | 2023.08.21 |