MySQL - NULL, NOT NULL

임재현·2021년 4월 28일
0

MySQL

목록 보기
6/52
post-custom-banner

UDEMY - The Ultimate MySQL Bootcamp: Go from SQL B…The Ultimate MySQL Bootcamp: Go from SQL Beginner to Expert강좌를 들으며 정리

Null Or Not Null

이전에 만들었던 cats테이블을 살펴보면 이렇게 생겼다.(CREATE TABLE cats(name VARCHAR(50), age INT) 질의어(SQL)로 만들어 줬었다.)

mysql> desc cats;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)

name , age 두 칼럼 모두 Null 이 YES이다. 이는 Null 값을 허용한다는 소리다. 실제로 한번 해보자.

mysql> insert into cats(name) values ('Alabama');
Query OK, 1 row affected (0.00 sec)

mysql> select * from cats;
+-----------+------+
| name      | age  |
+-----------+------+
| Jetson    |    7 |
| Victoria  |   12 |
| Draco     |   11 |
| Charlie   |   10 |
| Sadie     |    3 |
| Lazy Bear |    1 |
| Peanut    |    2 |
| Butter    |    4 |
| Jelly     |    6 |
| Alabama   | NULL |
+-----------+------+
10 rows in set (0.00 sec)

먼저 이름만 넣어줬다(Alabama). age 가 NULL 값으로 잘 들어간다.

이번에는 칼럼 두개 다 비운 채로 값을 넣어보겠다.

mysql> insert into cats() values();
Query OK, 1 row affected (0.00 sec)

mysql> select * from cats;
+-----------+------+
| name      | age  |
+-----------+------+
| Jetson    |    7 |
| Victoria  |   12 |
| Draco     |   11 |
| Charlie   |   10 |
| Sadie     |    3 |
| Lazy Bear |    1 |
| Peanut    |    2 |
| Butter    |    4 |
| Jelly     |    6 |
| Alabama   | NULL |
| NULL      | NULL |
+-----------+------+
11 rows in set (0.00 sec)

두 칼럼 모두 NULL값이 잘 들어갔다.

이번에는 좀 다르게 cats2 테이블을 만들어 보겠다.

mysql> CREATE TABLE cats2
    -> ( 
    -> name VARCHAR(100) NOT NULL,
    -> age INT NOT NULL
    -> );
Query OK, 0 rows affected (0.02 sec)

칼럼에 NOT NULL 속성을 추가해서 테이블을 만들어 줬다.

mysql> desc cats2;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name  | varchar(100) | NO   |     | NULL    |       |
| age   | int          | NO   |     | NULL    |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

이번에는 Null이 NO로 나왔다.

그리고 아까처럼 name 값만 지정해서 넣어줘보겠다.

mysql> insert into cats2 (name) values('texas');
ERROR 1364 (HY000): Field 'age' doesn't have a default value

오류가 나온다. age는 default value를 가지지 않는다는 에러가 나온다.

insert into cats2() values();
ERROR 1364 (HY000): Field 'name' doesn't have a default value

두 값을 모두 넣지 않은것 도 역시 에러메세지가 나온다.

mysql> select * from cats2;
Empty set (0.00 sec)

SELECT문을 써서 데이터를 확인해보면 역시 아무 데이터가 들어가지 않았다.

Set Default Value

이번에는 cats3테이블을 만들어 보기로 하자.

mysql> create table cats3(
    -> name varchar(100) default 'unnamed',
    -> age int default 99
    -> );
Query OK, 0 rows affected (0.01 sec)

mysql> desc cats3;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name  | varchar(100) | YES  |     | unnamed |       |
| age   | int          | YES  |     | 99      |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

디폴트 값이 각각 unnamed , 99name,age 칼럼이 만들어 졌다.

이제 위의 cats2테이블에 넣었던 것처럼 값을 넣어보자.

mysql> insert into cats3(name) values('hi'
    -> );
Query OK, 1 row affected (0.01 sec)

mysql> select * from cats3;
+------+------+
| name | age  |
+------+------+
| hi   |   99 |
+------+------+
1 row in set (0.00 sec)

먼저 name 에만 값을 넣어줘봤다. 정상적으로 잘 실행되고 결과를 보니 값을 넣어주지 않은 age에는 default로 설정한 99 가 들어갔다.

mysql> insert into cats3(age) values(3);
Query OK, 1 row affected (0.00 sec)

mysql> select * from cats3;
+---------+------+
| name    | age  |
+---------+------+
| hi      |   99 |
| unnamed |    3 |
+---------+------+
2 rows in set (0.00 sec)

이번에는 age에만 값을 넣어주고 name에는 값을 넣어주지 않았다. 정상적으로 잘 실행되고, name에는 default로 설정해줬던 unnamed가 들어갔다.

mysql> insert into cats3() values();
Query OK, 1 row affected (0.01 sec)

mysql> select * from cats3;
+---------+------+
| name    | age  |
+---------+------+
| hi      |   99 |
| unnamed |    3 |
| unnamed |   99 |
+---------+------+
3 rows in set (0.00 sec)

이번에는 두 값 모두 비운채로 넣어줬다. 두 값모두 각각 default로 설정한 unnamed, 99 가 들어간 것을 볼 수 있다.

그런데 이렇게 하면 어떻게 될까?

mysql> insert into cats3 (name,age) values('Montana', NULL);
Query OK, 1 row affected (0.00 sec)

mysql> select * from cats3;
+---------+------+
| name    | age  |
+---------+------+
| hi      |   99 |
| unnamed |    3 |
| unnamed |   99 |
| Montana | NULL |
+---------+------+
4 rows in set (0.00 sec)

NULL 이라는 값을 직접 집어 넣어줬다. 그러자 age 칼럼의 data type은 int지만 NULL이 들어간 것을 볼 수 있다.

이번에는 이렇게 테이블을 만들어보자.

mysql> create table cats4(
    -> name varchar(100) not null default 'unnamed',
    -> age int not null default 99
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql> desc cats4;
+-------+--------------+------+-----+---------+-------+
| Field | Type         | Null | Key | Default | Extra |
+-------+--------------+------+-----+---------+-------+
| name  | varchar(100) | NO   |     | unnamed |       |
| age   | int          | NO   |     | 99      |       |
+-------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)

NOT NULL 속성도 넣어줬고, DEFAULT 속성도 지정해줬다.

mysql> insert into cats4(name, age) values('Montana',NULL);
ERROR 1048 (23000): Column 'age' cannot be null

그리고 위에서 했던 것 처럼 NULL을 넣어줘봤더니 에러가 발생한다. 물론 값은 들어가지 않았다.

그럼 이번에는 값을 NULL로 지정해서 넣어주는 것이 아니라 아예 비워서 넣어주면 어떻게 될까?

mysql> insert into cats4() values();
Query OK, 1 row affected (0.01 sec)

mysql> select * from cats4;
+---------+-----+
| name    | age |
+---------+-----+
| unnamed |  99 |
+---------+-----+
1 row in set (0.00 sec)

그럼 default로 지정해준 값이 잘 들어가 있는 것을 확인할 수 있다! 즉, cats4의 경우 아무것도 안넣은 빈 데이터를 입력하면 default로 지정해 놓은 값이 들어가지만 NULL값을 넣으려고 하면 에러를 발생시키며 튕기는 것을 알 수 있다.

profile
임재현입니다.
post-custom-banner

0개의 댓글