본문 바로가기

IT/SQL

[sql] 제약조건 constraints - NOT NULL

지금까지 데이터베이스를 만들고, 테이블을 만들고 수정하는 법을 알아봤으니, 이제부터 테이블이나 컬럼을 만들 때 붙는 제약조건들을 하나씩 살펴보도록 하겠다.

SQL 제약조건은 테이블 안에 있는 데이터에 특정 규칙을 붙일 때 사용하면서 유용하게 쓸 수 있다.
SQL 제약조건은 테이블을 만드는 식인 CREATE TABLE이나 테이블을 수정하는 ALTER TABLE식에서 주로 쓰이게 된다.

 

CREATE TABLE 테이블_이름 (
컬럼명1 데이터_타입 제약조건,
컬럼명2 데이터_타입 제약조건,
컬럼명3 데이터_타입 제약조건,
...
);


테이블을 만들 때를 예로 들어보면, 컬럼의 데이터 타입을 지정한 후에, 한 칸 띄우고 제약조건을 달게 된다. 어려울 것은 없고 제약조건은 최대한 정확한 정보를 넣기 위한 하나의 룰이라고 생각하면 되겠다. 제약조건은 각각의 컬럼에 적용할 수도 있고, 테이블 전체에도 적용할 수 있다. 

 



NOT NULL

제약조건은 여러 종류가 있는데, 가장 기본적으로 CREATE TABLE에서 쓰이는 NOT NULL에 대해서 알아보자.
NOT NULL 조건의 디폴트 값은 NULL이다. 그래서 테이블을 만들 때 별로로 NOT NULL을 넣어주지 않으면, 자동으로 기본값인 NULL이 제약조건으로 설정된다.

NOT NULL은 NULL값을 허용하지 않겠다!! 쉽게 말해서 빈칸으로 두지 말고 반드시 데이터 값이 입력되어야만 한다!! 이런 규칙이다. 따라서 반드시 특정 데이터 값이 존재해야만 새로운 레코드를 넣거나 수정할 때 오류가 발생하지 않는다.

그럼 이제 예문을 통해서 확인해 보도록 하자. 필자는 memberID, name, phone이라는 이름의 컬럼을 가진 members 테이블을 만드는데, memberID와 name은 반드시 값이 들어가도록 설정하겠다.

> CREATE TABLE members (
    -> memberID int NOT NULL,
    -> name varchar(20) NOT NULL,
    -> phone varchar(20)
    -> );
Query OK, 0 rows affected (0.052 sec)

> desc members;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| memberID | int(11)     | NO   |     | NULL    |       |
| name     | varchar(20) | NO   |     | NULL    |       |
| phone    | varchar(20) | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.056 sec)


보면 phone 컬럼만 null값을 허용하고 있고, memberID와 name은 공백을 허용하지 않는 것을 알 수 있다.

 

자, 이번에는 ALTER TABLE에서 NOT NULL 제약조건은 어떻게 설정하는지 예문을 하나 더 살펴보자.

위에 만들어진 members 테이블에서 phone 컬럼에 null 값을 허용하지 않도록 설정해보자.

 

> ALTER TABLE members
    -> MODIFY phone varchar(20) NOT NULL;
Query OK, 0 rows affected (0.108 sec)
Records: 0  Duplicates: 0  Warnings: 0

> desc members;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| memberID | int(11)     | NO   |     | NULL    |       |
| name     | varchar(20) | NO   |     | NULL    |       |
| phone    | varchar(20) | NO   |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.049 sec)


이전의 결과와는 다르게 phone 컬럼에도 not null이 설정된 것을 확인할 수 있다.