개요
AUTO_INCREMENT로 선언된 열에 NULL 값을 삽입하면 MySQL이 자동으로 새로운 시퀀스 번호를 생성해 주는 예제를 통해, AUTO_INCREMENT가 PRIMARY KEY 제약 조건보다 먼저 처리된다는 사실을 이해할 수 있습니다.
AUTO_INCREMENT 열에 NULL 삽입하기
먼저 id 열을 NOT NULL, PRIMARY KEY, AUTO_INCREMENT로 선언한 테이블을 만들고, 여기에 NULL 값을 삽입해 보겠습니다.
mysql> Create table employeeinfo(id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, Name Varchar(10)); Query OK, 0 rows affected (0.16 sec) mysql> Insert into employeeinfo(id, Name) values(NULL, 'Saurabh'); Query OK, 1 row affected (0.07 sec) mysql> Select * from employeeinfo; +----+---------+ | id | Name | +----+---------+ | 1 | Saurabh | +----+---------+ 1 row in set (0.00 sec)
위 결과에서 흥미로운 점을 확인할 수 있습니다. id 열은 NOT NULL과 PRIMARY KEY로 선언되었음에도 불구하고 NULL 값이 오류 없이 정상적으로 입력되었습니다.
그 이유는 해당 열이 동시에 AUTO_INCREMENT로도 선언되어 있기 때문입니다. AUTO_INCREMENT 속성이 적용된 열에는 NULL을 삽입하더라도 MySQL이 자동으로 다음 시퀀스 번호(여기서는 1)를 생성하여 저장하기 때문에, PRIMARY KEY의 NOT NULL 제약 위반 오류가 발생하지 않는 것입니다.
AUTO_INCREMENT가 없는 경우의 비교
반면, AUTO_INCREMENT 없이 PRIMARY KEY만 선언된 열에 NULL을 삽입하려고 하면 MySQL은 아래와 같은 오류를 반환합니다.
mysql> create table people(id INT primary key, name varchar(10)); Query OK, 0 rows affected (0.18 sec) mysql> Insert into people(id, name) values(NULL, 'Rahul'); ERROR 1048 (23000): Column 'id' cannot be null
위 예제처럼 AUTO_INCREMENT가 없는 일반 PRIMARY KEY 열에는 NULL을 허용하지 않으며, ERROR 1048 (23000): Column 'id' cannot be null 오류가 발생하는 것을 확인할 수 있습니다.
결론
두 예제를 종합하면 다음과 같은 결론을 내릴 수 있습니다. AUTO_INCREMENT 처리는 PRIMARY KEY 제약 조건 검사보다 항상 먼저 수행됩니다.
즉, MySQL은 행을 삽입하는 과정에서 AUTO_INCREMENT 값 생성 단계를 먼저 해결한 뒤에 PRIMARY KEY 제약 조건을 검사하기 때문에, AUTO_INCREMENT가 설정된 PRIMARY KEY 열에는 NULL을 삽입해도 오류 없이 새로운 시퀀스 번호가 할당되는 것입니다.