SQL, 어렵지 않게 사용하기 - Constaint

2020. 5. 11. 00:12BACKEND/Database

안녕하세요.

지난 포스팅에서DML이 무엇인지, SELECT, INSERT, UPDATE, DELETE에 대해 알아보았습니다.

이번에는 SQL 사용하는 방법 중 제약조건에 대해 알아볼 예정입니다❗️

 

***************** INDEX *****************

[ 1장 ]

🗂 INDEX

🤖 DML

 

[ 2장 ]

🤙🏻 CONSTRAINT

- Primary key -

-Foreign key -

- Unique -

- Default -

-Not Null -

 

[ 3장 ]

✍🏻 DDL

********************************************

🤙🏻 CONSTRAINT

Constraint? 제약조건?

제약조건이란 무엇일까요?

이름에서 알 수 있듯이 데이터를 다룰 때 어떠한 제약을 두는 것입니다.

 

그럼 이러한 제약조건을 왜 사용하는 것일까요?

 

바로 데이터의 무결성을 지키기 위해 제한된 조건을 걸어둡니다.

데이터의 무결성이란 데이터의 정확성, 일관성, 유효성이 유지되는 것을 말합니다.

그래서 특정 데이터를 입력할 때 어떠한 조건을 만족했을 때만 입력되도록 제약할 수 있죠.

 

제약조건을 테이블에 적용시키기 위해서는 두 가지 방법을 사용할 수 있습니다.

첫 번째, 컬럼 레벨에서 사용하는 방법

두 번째, 테이블 레벨에서 사용하는 방법

 

둘 다 외우지 않아도 됩니다! 사용하면서 편한 걸 찾아보고 사용하면 됩니다 😁

 

제약조건은 Primary Key, Foreign Key, Unique, Default, Null 5가지가 있습니다.

하나씩 살펴볼까요?

 

 

📎 Primary Key (기본키)

✔️ 기본키란 무엇일까요❓

 

테이블에 존재하는 많은 행의 데이터를 구분할 수 있는 식별자
중복되어서도 안되며 비어서도 안됨

 

기본키는 테이블에서 하나 이상의 열에 설정할 수 있습니다.

Primary Key (이하 PK) 는 식별자인 만큼 테이터 튜플에 대한 접근을 할 수 있는 지표입니다.

 

그래서 PK를 설정할 때에는 몇가지 고려해야할 점이 있습니다.

 

일단, 데이터의 값이 자주 바뀌면 안되겠죠? 

데이터 튜플의 대표이니 만큼, 데이터를 자주 바꾸게 되면 데이터 튜플을 찾기 어려워집니다.

 

또, 단순한 값이 좋습니다.

PK의 값을 통해 데이터를 조회합니다.

그런데 PK의 데이터가 무겁고 복잡하다면 어떨까요?

사용자뿐만 아니라, DBMS에서도 속도가 저하될 것입니다.

 

✔️ 기본키를 어떻게 적용할까요❓

테이블을 생성할 때수정할 때 생성할 수 있습니다.

CREATE TABLE 은 테이블을 만들기라고 생각해주세요 〰️

 

[CONSTRAINT PK_user_userIdx] 는 생략해도 된다는 의미입니다.

 

// Column Level
CREATE TABLE user
(userIdx int PRIMARY KEY,
name varchar(10) NOT NULL,
        ...
);

// Table Level
CREATE TABLE user
(userIdx int,
name varchar(10) NOT NULL,
        ...
[CONSTRAINT PK_user_userIdx] PRIMARY KEY (userIdx));

 

혹은, 테이블 수정을 통해 생성할 수도 있습니다.

 

 

ALTER 사용 시

 

ALTER TABLE user 
ADD [CONSTRAINT PK_user_userIdx]
PRIMARY KEY (userID);

 

PK_user_userIdx 는 만들어진 PK의 이름입니다.

주로 PK_tableName_Column 이라는 형식으로 설정하곤 합니다.

 

 

✈️ Foreign Key (외래키)

✔️ 외래키란 무엇일까요?

이름만 보면 어떤 것인진 몰라도 외부에 있는 것과 관련이있다? 정도는 느낌이 오시나요?

그와 비슷하게, 외래키란 한 테이블의 키 중에서 다른 테이블의 레코드를 유일하게 식별할 수 있는 키입니다.

 

예를 들어, 아래와 같이 상품 정보가 담긴 테이블이 있고 주문 정보가 담긴 테이블이 있다고 생각해보세요.

주문 정보 테이블 내에는 어떤 상품을 주문했는지 담겨있어야합니다.

그럼 주문 정보를 가리켜야 겠죠?

 

외래키 예시

 

위에서 예상할 수 있듯이, 외래 키 관계를 설정하면 하나의 테이블(자식테이블)이 다른 테이블(부모테이블)에 의존하게 됩니다.

 

자식 테이블에서 부모테이블로 조건을 추가하게 되고, 자식 테이블 (외래키 포함된 테이블)에서 조건을 걸어주면 됩니다.

 

 

 

위의 그림처럼요!

 

외래키를 설정할 때에는 꼭 알아야하는 것들이 있습니다.

 

첫 번째, 반드시 자식 테이블에서 유일한 값을 갖는 필드를 참조해야 하며 기본 키를 참조할 수도 있습니다.

두 번째, 부모 테이블에서는 중복된 값NULL을 가질 수도 있습니다.

 

✔️ 그럼 외래키는 어떻게 추가할까요?

이것도 생성 단계에서 생성할 수도 있고, 수정 단계에서 생성할 수도 있습니다.

[CONRAINT FK_product_product_id] 는 생략해도 된다는 의미입니다.

 

 

생성 할 때

 

CREATE TABLE order 
(num int AUTO_INCREMENT PRIMARY KEY, 
userID char(8) NOT NULL, 
product_id int,
        ...
[CONRAINT FK_product_product_id] FOREIGN KEY (product) REFERENCES product (product_id)
);

 

만약, ALTER을 사용해서 적용하고 싶다면

 

 

ALTER 사용

 

ALTER TABLE order 
ADD [CONSTRAINT FK_product_product_id] FOREIGN KEY (product_id) 
REFERENCES product (product_id) ON DELETE CASCADE;

 

위와 같이 설정할 수 있습니다.

 

 

여기서 뒤에 붙은 ON DELETE CASCADE 라는 단어있는데, 무슨 의미 일까요❓

비슷한 기능으로 ON UPDATE CASCADE라는 것도 있는데, 왜 사용한건지 무엇을 의미하는지 알아볼게요

 

✔️ 외래키 수정/삭제 시 연결된 데이터 처리 방법

 

데이터를 변경/삭제할 때 그 데이터를 참고하던 다른 테이블의 데이터는 어떻게 처리할거야?

 

라는 질문을 한다면, 다양한 상황에 따라 대답을 할 수 있겠죠?

 

그래서 부모 테이블의 데이터가 ON DELETE (데이터가 사라지면)이거나 ON UPDATE (데이터가 바뀌면)

자식 테이블의 데이터를 어떻게 처리할지에 대해 설정해놓는 값입니다.

 

RESTRICT : 변경/삭제가 취소 (거부)

CASCADE : 함께 변경/삭제

NO ACTION : 변경/삭제할 개체만 변경/삭제되고 참조하고 있는 개체는 변동이 없음

SET NULL : 참조하고 있는 값은 NULL로 세팅

 

위의 네가지를 설정할 수 있습니다.

 

마지막으로, 설정된 외래키를 확인하고 싶다면

 

SHOW INDEX FROM <테이블_이름>

 

를 입력해 보세요 〰️

 

 

 

👆🏻 Unique (유일키)

✔️ 유일키란 무엇일까요?

이름에서 알 수 있듯이 ‘중복되지 않는 유일한 값’을 입력해야 하는 조건입니다.

PRIMARY KEY와 거의 비슷하지만, UNIQUE는 NULL 값 허용합니다 〰️

 

예를 들어 Email을 받는다고 하면 서로 다른 email을 갖으며 null이 될 수도 있겠죠❓

UNIQUE도 생성하면서 설정할 수도, 수정을 통해서도 적용시킬 수 있습니다.

 

✔️ 유일키를 어떻게 적용할까요❓

/-- Column Level --/
CREATE TABLE user (
userID varchar(8),
name varchar(10),
email varchar(30) UNIQUE);

/-- Table Level --/
CREATE TABLE user (
userID varchar(8), 
name varchar(10), 
email varchar(30), 
[CONSTRAINT UK_user_email] UNIQUE (email));

 

위 처럼 말이죠.

혹은 ALTER 을 사용하여 아래와 같이 생성할 수도 있습니다.

 

ALTER 사용 시

 

 ALTER TABLE user 
 ADD [CONSTRAINT UK_user_email] UNIQUE (email);

 

 

 

📍 Default (기본값)

✔️기본 값이 무엇일까요❓

기본값은 데이터의 값을 입력하지 않았을 때, 자동으로 입력되는 기본 값 정의하는 방법입니다.
일반적으로 컬럼레벨의 제약조건을 지정합니다.

 

✔️기본 값을 어떻게 설정할까요❓

생성하면서 설정하고 싶다면 아래와 같이 사용합니다.

 

CREATE TABLE user (
    userId int,
    name varchar(30),
    address varchar(30) DEFAULT 'seoul',
);

 

혹은 ALTER를 사용해서 기본값을 설정하고 싶다면,

 

ALTER 사용시

 

ALTER TABLE user
ALTER COLUMN address SET DEFAULT 'seoul';

 

위와 같이 사용해주시면 됩니다.

 

 

 

🔍 Not Null

✔️ NULL은 무엇을 의미할까요?

데이터의 값 중 NULL을 허용한다는 의미입니다. ( 빈 값 허용안함 )

빈 값을 넣어도 아무런 이상이 없는 것이죠 〰️

필드를 생성할 때, Default로 NULL이 들어갑니다.

 

그럼 반대로 NULL값을 허용하지 않을 때에는 어떻게 해야할까요❓

그 땐, NOT NULL을 사용합니다.

 

✔️ 어떻게 생성하는지 같이 살펴봅시다 ❗️

CREATE TABLE user 
(userId char(8),
name varchar(10) NOT NULL, 
birthYear int NOT NULL, 
addr char(2) NOT NULL );

 

위와 같이 정의해주거나,

 

ALTER 사용 시

 

ALTER TABLE user
MODIFY COLUMN name varchar(10) NOT NULL;

/-- 필드 추가하면서 NOT NULL을 하고 싶다면 --/
ALTER TABLE user
ADD COLUMN name varchar(10) NOT NULL;

 

위와 같이 입력해주면 됩니다 ❗️

 

 

✂️ 제약조건 삭제하기

이렇게 생성한 제약조건들을 삭제하려면 어떻게 해야할까요❓

외래키를 제외하고는 똑같은데요.

 

기본적인 삭제부터 알아보겠습니다.

 

/-- 제약 조건 이름 확인하기 --/ 
SELECT * FROM <테이블명>;

/-- 제약 조건 삭제하기 --/
ALTER TABLE <테이블명> 
DROP CONSTRAINT <제약_조건_이름>;

 

위와 같이 적어주면 됩니다 〰️

그럼 외래키를 삭제하려면 어떻게 해야할까요❓

 

ALTER TABLE <테이블명> FOREIGH KEY <제약_조건_명>;

 

위와 같이 입력해주면 삭제할 수 있습니다 ~

 

 

 

지금까지 SQL을 사용하면서 꼭 필요한 제약조건에 대해 알아보았습니다 〰️

도움이 되셨으면 좋겠어요 ❗️