본문 바로가기

SQL

[SQL] NOT NULL & DEFAULT 비교하기

DB 테이블 생성 중 NOT NULL 에 대해 검색해보다가 흥미있는 글이 있어 정리해본다.

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

name 칼럼만 있는 테이블을 다음과 같이 만들고 다음의 두 가지 제약을 설정한다.

  • NOT NULL : 해당 칼럼이 NULL 값이 되면 안된다.
  • DEFAULT "홍길동" : 값이 입력되지 않으면 "홍길동" 값으로 저장된다.
CREATE TABLE SAMPLE_TABLE (
    NAME VARCHAR(30) NOT NULL DEFAULT "홍길동"
);

Query를 다음과 같이 작성을 때 결과는 어떻게 나올것인가?

/* QUERY 1 */
INSERT INTO SAMPLE_TABLE (NAME) VALUES (NULL);
/* QUERY 2 */
INSERT INTO SAMPLE_TABLE (NAME) VALUES ();
  • Query 1의 경우 NULL 값을 입력받았다고 생각하기 때문에, NOT NULL 제약이 활성화되어 오류가 발생한다.
  • Query 2의 경우, 아무 것도 입력받지 않았기 때문에 DEFAULT "홍길동" 제약이 작동한다.

정리하면

  • NOT NULL만 있는 경우: NULL을 직접 입력하든, 아무 것도 입력하지 않든 NULL 값이 넘어가서 두 경우 모두 오류가 발생한다.
  • DEFAULT만 있는 경우: 사용자가 값을 입력하지 않는 경우에 알아서 해당 칼럼에 값을 부여한다. 만약 사용자가 NULL을 입력한다면 값을 입력한 것으로 보기 때문에, DEFAULT 제약은 활성화되지 않는다.
  • NOT NULL, DEFAULT 모두 있는 경우: 둘다 있는 경우에는 사용자가 값을 입력하지 않는 경우에는 알아서 DEFAULT가 활성화되고, NULL을 입력하는 경우에는 NOT NULL 제약이 활성화되어 오류가 발생한다.