Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL 기본 키(Primary Key) 필드에 NOT NULL을 명시할 필요가 없는 이유

MySQL에서 기본 키(Primary Key) 필드에 NOT NULL을 별도로 지정할 필요는 없습니다. 기본 키를 설정하면 MySQL이 내부적으로 자동으로 NOT NULL 속성을 부여하기 때문입니다. 즉, 기본 키는 NOT NULL과 UNIQUE 제약 조건이 결합된 형태라고 할 수 있습니다.

기본 키 필드 동작 확인하기

먼저 예제용 테이블을 생성해 보겠습니다. 아래 쿼리로 테이블을 만들 수 있습니다:

mysql> create table NotNullAddDemo
    -> (
    -> Id int AUTO_INCREMENT,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.81 sec)

위 테이블에서는 기본 키 필드에 NOT NULL을 명시하지 않았지만, MySQL이 내부적으로 자동 변환해 줍니다. 실제로 NOT NULL이 적용되었는지 확인하려면 다음 구문을 사용합니다.

DESC yourTableName;

이제 위 구문을 실행해 테이블 구조를 확인해 보겠습니다:

mysql> desc NotNullAddDemo;

실행 결과는 다음과 같습니다:

+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| Id    | int(11) | NO   | PRI | NULL    | auto_increment |
+-------+---------+------+-----+---------+----------------+
1 row in set (0.07 sec)

출력 결과에서 Null 컬럼을 보면 값이 NO로 표시되어 있습니다. 이는 해당 필드에 NULL 값이 허용되지 않음을 의미합니다.

NULL 값 삽입으로 NOT NULL 직접 확인하기

NOT NULL 여부를 실질적으로 확인하기 위해 테이블에 NULL 레코드를 삽입해 보겠습니다. AUTO_INCREMENT 컬럼에 NULL을 입력하면 에러 없이 처리되며, 매번 1부터 순차적으로 값을 카운트합니다. 레코드를 삽입하는 쿼리는 다음과 같습니다:

mysql> insert into NotNullAddDemo values(NULL);
Query OK, 1 row affected (0.12 sec)
mysql> insert into NotNullAddDemo values(NULL);
Query OK, 1 row affected (0.45 sec)

기본 키에 NULL 값을 두 번 삽입한 후, 값 1을 삽입하려고 하면 오류가 발생합니다. 그 이유는 MySQL이 첫 번째 NULL 값을 1로, 두 번째 NULL 값을 2로 간주하기 때문입니다.

값 1을 삽입하려고 하면 다음과 같은 오류가 출력됩니다:

mysql> insert into NotNullAddDemo values(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'

반면 값 3을 삽입하면 정상적으로 처리됩니다:

mysql> insert into NotNullAddDemo values(3);
Query OK, 1 row affected (0.21 sec)
mysql> insert into NotNullAddDemo values(NULL);
Query OK, 1 row affected (0.18 sec)

SELECT 문을 사용하여 테이블의 모든 레코드를 조회해 보겠습니다:

mysql> select *from NotNullAddDemo;

실행 결과는 다음과 같습니다:

+----+
| Id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

위 결과에서 알 수 있듯이, NULL로 삽입된 두 레코드는 각각 1과 2로 저장되었으며, 이후 명시적으로 삽입한 3과 AUTO_INCREMENT가 계산한 4까지 총 4개의 레코드가 존재합니다. 이처럼 기본 키 필드에는 NOT NULL이 자동으로 적용되기 때문에, 별도로 명시할 필요가 전혀 없습니다.