본문 바로가기
개발/DB

[DB] Not Null 과 Default 설정

by seopport 2023. 12. 7.
728x90
반응형

들어가기 전에

일반적으로 DB 를 생성하여 각 Column 에 특정한 설정을 할 수 있습니다. NOT NULL과 DEFAULT는 데이터베이스에서 열(컬럼)의 제약 조건을 정의하는 데 사용되는 용어입니다. 테이블을 조사하다보니, 개발계와 운영계에 특정 컬럼의 제약 조건이 달랐습니다. 

 

[DB] Not Null 과 Default 설정
[DB] Not Null 과 Default 설정

 

시스템의 안정화를 위해서 대부분의 시스템은 개발계와 운영계를 나누어 운영하고 있습니다. 물론 회사마다 조금씩 구조는 다르며 사용하는 DB 마다 다를 수 있습니다.

 

코딩으로 글짓기

 

개발 서버 운영 서버 나누는 이유 (개발계 → 운영계)

대부분의 소프트웨어는 개발 서버와 운영 서버를 각각 두는 전략을 사용합니다. 특히 분리는 물리적입니다. 실제 서버 장비를 두 대 이상 사용합니다. 개발과 운영 서버를 분리하는 이유는 서비

change-words.tistory.com

 

NOT NULL 과 DEFAULT 정의

  • NOT NULL
    • NOT NULL은 열이 NULL 값을 허용하지 않음을 나타내는 제약 조건입니다.
    • 해당 열에는 반드시 값을 가져야 하며, 데이터가 삽입될 때 NULL 값이 허용되지 않습니다.
  • DEFAULT
    • DEFAULT 는 열에 데이터가 명시되어 있지 않을 때 사용되는 기본값을 설정하는 데 사용됩니다.
    • 만약 데이터가 삽입되지 않거나 NULL로 삽입될 때, 시스템은 해당 열에 기본값을 할당합니다.

 

문제 발견

특정 컬럼의 값이 NOT NULL 설정이 되어 있으나 DEFAULT 가 NULL 값이었습니다. 물론 운영계 테이블에는 DEFAULT 값이 '-' 였기

때문에 문제가 발생하진 않았습니다. 문제는 개발계 테이블입니다.

 

물론 차세대가 얼마 끝나지 않았고, 운영에 배포를 했어도 실제 사용기간이 아니여서 수정할 수 있었습니다.

 

그렇다면 다음과 같이 테이블을 생성할 수는 있을까요?

CREATE TABLE 생성테이블 (
    특정컬럼 VARCHAR(50) NOT NULL DEFAULT NULL
);

 

생성은 됩니다. 그러나 NOT NULL 제약 조건이 이미 적용되어 있기 때문에 DEFAULT NULL 부분은 상쇄되고, NOT NULL 제약으로 인해 해당 컬럼은 NULL 값을 가질 수 없습니다. 따라서 DEFAULT NULL를 명시하는 것은 조금 중복된 표현입니다. 

 

아래와 같이 간소화하여 작성해도 동일한 결과를 얻을 수 있습니다.

CREATE TABLE 생성테이블 (
    특정컬럼 VARCHAR(50) NOT NULL
);

 

그렇다면 NOT NULL 과 DEFAULT 를 굳이 같이 사용해야 할까요?

각각 비교를 해서 결과를 확인해 보겠습니다.

 

NOT NULL 설정만 있는 경우

-- 테이블 생성
CREATE TABLE 테이블1 (
    컬럼1 VARCHAR(50) NOT NULL
);

-- NULL 값 삽입 시도
INSERT INTO 테이블1 (컬럼1) VALUES (NULL);
-- 에러 발생: NOT NULL 제약 위반

-- 빈 값 삽입 시도
INSERT INTO 테이블1 (컬럼1) VALUES ();
-- 에러 발생: NOT NULL 제약 위반


-- 빈 문자열 삽입 시도
INSERT INTO 테이블1 (컬럼1) VALUES ('');
-- 에러 발생: NOT NULL 제약 위반

 

DEFAULT 설정 만 한 경우

-- 테이블 생성
CREATE TABLE 테이블2 (
    컬럼2 VARCHAR(50) DEFAULT 'seopport'
);

-- DEFAULT 값을 사용한 INSERT 문
-- 빈 값 삽입
INSERT INTO 테이블2 (컬럼2) VALUES ();
-- 결과: 컬럼2에 'seopport' 값이 삽입됨

-- NULL 값 삽입
INSERT INTO 테이블2 (컬럼2) VALUES (NULL);
-- 결과: 컬럼2에 NULL 값이 삽입됨

-- 빈 문자열 삽입
INSERT INTO 테이블2 (컬럼2) VALUES ('');
-- 결과: 컬럼2에 빈 문자열이 아닌 'seopport' 값이 삽입됨

 

NOT NULL 과 DEFAULT 둘 다 설정 한 경우

-- 테이블 생성
CREATE TABLE 테이블3 (
    컬럼3 VARCHAR(50) DEFAULT 'seopport' NOT NULL
);

-- DEFAULT 값을 사용한 INSERT 문
-- 빈 값 삽입
INSERT INTO 테이블3 (컬럼3) VALUES ();
-- 결과: 컬럼3에 'seopport' 값이 삽입됨

-- NULL 값 삽입
INSERT INTO 테이블3 (컬럼3) VALUES (NULL);
-- 결과: 컬럼3에 'seopport' 값이 삽입됨

-- 빈 문자열 삽입
INSERT INTO 테이블3 (컬럼3) VALUES ('');
-- 결과: 컬럼3에 'seopport' 값이 삽입됨

 

정리

먼저 위에서 질문한 것처럼, '그렇다면 NOT NULL 과 DEFAULT 를 굳이 같이 사용해야 할까요?' 에 대답은 따로 사용은 할 수 있다 라고 생각합니다. 

 

NOT NULL 과 DEFAULT constraint 는 서로 중복되는 것이 아닌 각각의 필요성이 존재하는 제약입니다. 개인적으로 특정한 경우가 아닌 경우에는 두 가지 모두 제약 조건을 설정하는 것이 좋아보입니다.

 

참고 페이지

SQL Column definition: default value and not null redundant?

 

SQL Column definition: default value and not null redundant?

I've seen many times the following syntax which defines a column in a create/alter DDL statement: ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault" The question is:...

stackoverflow.com

 

DB) NOT NULL과 DEFAULT를 동시에 쓸 필요가 있는가?

 

DB) NOT NULL과 DEFAULT를 동시에 쓸 필요가 있는가?

DB constraint에서 NOT NULL과 DEFAULT를 동시에 쓸 필요가 있나요?

frhyme.github.io

 

Codren 블로그

 

DB Not null 과 Default 둘 다 써야 되는가?

DB 테이블을 생성할 때 Constraint 으로 Not null 과 Default 를 둘 다 써야..되면 둘 다 써야됩니다 :)

velog.io

 

728x90
반응형