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

MySQL에서 AUTO_INCREMENT가 PRIMARY KEY 제약 조건보다 우선하는 이유

개요

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을 삽입해도 오류 없이 새로운 시퀀스 번호가 할당되는 것입니다.