Day05-5 컬럼 속성

이하연·2023년 2월 14일

DBMS 교육

목록 보기
19/22

저번 포스팅에서는 DDL, DML, 그리고 데이터 타입에 커밋과 롤백까지 알아보았습니다. 이번에는 더 세밀하게 파고들어서 컬럼이 가지고 있는 기능 및 속성에 대해서 알아볼건데요. 아마 이번이 오늘의 마지막 포스팅이 될 것 같습니다.

컬럼 속성


(출처: SQLShackhttps://bit.ly/3E7ic4N)

컬럼(행)은 데이터의 무결성을 보존해줍니다. 그럼 이 컬럼 속성이라는 것은, 무결성 제약 조건이라고도 할 수 있는데요.

이에는 여러 조건들이 있습니다.

1. 무결성 제약 조건 종류

  1. not null : null 값을 입력하지 못하게 하는 조건
  2. unique : 중복된 값을 입력하지 못하게 하는 조건
  3. check : 주어진 값만 허용
  4. primary key : not null + unique + index 다 합한 의미
  5. foreign key : 다른 테이블 / 컬럼 참조하여 무결성을 검사

하나씩 알아가보도록 하겠습니다.

2. not null

Not Null, 말 그대로 null 값을 허용하지 못하게 하는 조건입니다.

이를 컬럼의 조건에 적용시켜주는 법은 간단합니다. 생성하는 컬럼 값 데이터 타입 옆에 명시해주면 되는데요.

> 컬럼명 데이터 타입 not null

그리하면 위처럼 작성하실 수 있습니다. 물론 Null 값을 주고 싶다면 그 반대로 하시면 됩니다. 이리 하면 이 컬럼에는 null 값을 일체 지정해줄 수 없게 됩니다.

3. Unique

Unique, 특별한 이라는 뜻이죠. 그 뜻 그대로, 이는 중복된 값을 줄 수 없고 다 다른 값을 주어야 합니다.

이 역시 Not Null과 적용 방법이 같습니다.

> 컬럼명 데이터 타입 unique

위의 예시는 unique_test라는 테이블의 컬럼 1,2에 unique를 적용시킨 모습입니다. 뒤에 Not Null이 있지만 다른 조건으로 분류되어 Unique가 먼저 발생하게 되는데요.


현재 테이블 안에 이러한 값들이 있습니다. 한번 같은 값들을 주려 시도해보겠습니다.


Insert Into 문을 실행해봤습니다.

경고문(에러)가 뜨네요. 이미 있는 값이라고 허용하지 않습니다.

4. Check

Check, 은 보통 확인하다라는 뜻으로 쓰이죠. 비스무리하다고 볼 수 있겠습니다. 이 명령어는 사전에 테이블을 생성할 때 들어갈 값을 지정해놓고 그 안에서 벗어나면 에러가 납니다.

> 컬럼명 데이터 타입 Check(컬럼명 IN (지정값));

그리하여 IN 문을 사용해주게 되는데요. 이는 이 지정된 값에 있으면 값 기입을 허용해주는 역할을 합니다.

코드로 볼까요?

여기 check_test문을 테스트할 테이블이 있습니다.

성별 기입이 목적인지 check과 IN문을 통해 값은 '여성' 혹은 '남성'밖에 받지 않는데요. 한번 다른 값을 줘보고 테스트 해보겠습니다.


주황색으로 표시한 값이 지정 값과 다른 값들입니다. 한번 결과값을 볼까요?


지정 값이 아니라고 안 되네요. 이리 하여 적용하실 수 있겠습니다.

5. Primary Key(기본키)

관계 대표 키

각각의 테이블에는 이 테이블의 주가 되는 기본 키(PK, Primary Key)가 있습니다. 이는 관계를 대표하는 키라고 볼 수도 있는데요. 이는 다른 외부의 키와 연결해주는 기능을 함으로서 상호작용을 가능케 합니다.

이는 테이블당 하나만 정의 가능하며, 식별자라고 불리기도 하는데요. 이는 다음과 같은 속성의 합성물입니다.

Not Null + Unique + index

index에 대해서는 나중에 알아보기로 하고, 이를 지정하는 법은 알려드리겠습니다.

선언 방법

선언 방법은 간단합니다. 이 역시 테이블을 생성할 때 데이터 타입 뒤로 지정해주시면 됩니다.


이를 선언하는 방법에는 위처럼 3가지가 있습니다. 실행하게 된다면 하나가 아니게 되어 오류가 발생하겠네요.

가장 많이 사용하는 방법은 아무래도 가장 간편하여 노란색으로 칠해드린 부분이 되겠습니다.

아래는 제대로 테이블을 생성될 예시의 테이블입니다.

그럼 이 primary_test로 가서 PK가 제대로 지정되어 있는지 확인해볼까요?


그리하여 성공적으로 지정된 모습을 보실 수 있습니다.

6. Foreign Key(외래키)

이에 더불어 외래키(Foreign Key)라는 것이 있습니다. 이는 외부 키, fk, 참조 키 등 다양하게 불리는데요.

보통 FK가 정의된 테이블을 자식 테이블, FK가 연결되어 PK가 있는 테이블을 부모 테이블이라고 합니다. 자바의 상속과 비슷하죠?

이 외래키의 경우, 부모 테이블의 PK 컬럼에 존재하는 데이터만 자식 테이블에 입력할 수 있게 됩니다. 또한, 부모 테이블은 자식 테이블이 삭제 된다고 영향을 받지 않으며 참조되는 데이터 컬럼과 데이터 타입이 일치하여야 합니다.

(기본 키, Unique만 연결 가능)

이 외래키를 설정해주는 방법은 두 가지가 있습니다.

1. 인라인 (In-line)

이는 컬럼 하나 추가 후 그를 외래 키로 지정하고 그 후에 다른 컬럼들을 추가해주는 방식입니다.

2. 아웃라인 (Out-line)

그에 더불어서, 이는 컬럼 전체 밖으로 기본 키와 연결하고 전체 컬럼을 먼저 지정해주며 외래키를 추가하는 방식입니다.


이를 지정할 때에는 어느 컬럼을 선택할지 FOREIGN KEY로 지정해주어야 합니다.

엔티티 관계도 참조

Daddy와 Daughter 테이블을 아래처럼 생성했다고 해봅시다.

기본키만 있는 Daddy는 부모, 그에 따라 외래키가 있는 Daughter은 자식 테이블입니다.

이 두 테이블의 엔티티 관계도를 보시면 아래와 같이 부모-자식 관계로 잘 이루어져있는 모습과 mID가 서로에게 묶여있는 모습을 보실 수 있습니다.

이처럼 외래키와 기본키는 서로 연결된 값으로 조인(Join)도 시행해줄 수 있게 됩니다.

Bonus.

이 속성들과 더불어서 외래키와 기본키 간의 상호 관계에서 삭제 부분을 담당하는 명령어들도 있는데요.

이에는 2가지가 있습니다. on delete cascade와 on delete set null 인데요.

1. on delete cascade
: 참조된 부모 테이블 행에 대한 delete 실행, 자식 테이블 값 함께 삭제
2. on delete set null
: 참조된 부모 테이블 행에 대한 delete 실행, 자식 테이블 값 null 변환

이는 부모 테이블에서 delete를 행할 때, 자식 테이블을 완전 삭제할지 null로 변환할지에 여부에 따라 달라지는 명령어인데요.

그냥은 이해하시기 힘드실테니, 코드와 함께 보겠습니다.

on delete cascade 예시

자식 테이블인 daughter에게 외래 키를 선언할 때 on delete cascade를 같이 설정해준 모습입니다.

그리고 이 부모-자식 테이블에게 연결되어 있는 MID 테이블의 데이터를 한번 삭제해주려고 하는데요.

우선, 현재 데이터가 이렇게 있습니다.

Daddy


Daughter

저기에서 MID의 10이라는 데이터를 Daddy에서 삭제해보도록 하겠습니다.


이리 삭제를 해주시면.. 우리는 on delete cascade를 했기 때문에

아래처럼 자식 테이블에도 같이 사라지는 모습을 보실 수 있습니다.

끝!

이로서 컬럼 속성과 오늘 교육에 내용에 관한 포스팅을 마칩니다. 다음 포스팅에서 뵙겠습니다.

profile
애옹.

0개의 댓글