들어가기 전에
일반적으로 DB 를 생성하여 각 Column 에 특정한 설정을 할 수 있습니다. NOT NULL과 DEFAULT는 데이터베이스에서 열(컬럼)의 제약 조건을 정의하는 데 사용되는 용어입니다. 테이블을 조사하다보니, 개발계와 운영계에 특정 컬럼의 제약 조건이 달랐습니다.
시스템의 안정화를 위해서 대부분의 시스템은 개발계와 운영계를 나누어 운영하고 있습니다. 물론 회사마다 조금씩 구조는 다르며 사용하는 DB 마다 다를 수 있습니다.
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?
DB) NOT NULL과 DEFAULT를 동시에 쓸 필요가 있는가?
'개발 > DB' 카테고리의 다른 글
[DB] Redis 에 대해서 알아보자 (0) | 2023.12.20 |
---|---|
[DB] 트랜잭션(Transaction)에 대해서 알아보자. (2) | 2023.12.09 |
[DB] Random Access (랜덤 액세스) 란? (0) | 2023.10.14 |
[DB] 스키마와 테이블은 다른가요? (0) | 2023.09.06 |
[DB] 프로시저(Procedure) 그리고 경험 (0) | 2023.09.03 |