MySQL의 LAST_INSERT_ID() 함수는 가장 최근에 생성된 시퀀스 번호(AUTO_INCREMENT 값)를 반환하는 함수로 널리 알려져 있습니다. 하지만 다중 행 삽입(multiple-row insert)을 수행할 경우에는 예상과 달리 가장 먼저 삽입된 행에서 생성된 시퀀스 번호를 반환합니다.
예제
mysql> Insert into Student(Name) values('Ram'),('Mohan'),('Aryan');
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0
위 쿼리는 다중 행 삽입 방식을 사용해 Student 테이블에 세 개의 값을 한 번에 삽입합니다. 'Id' 컬럼에 저장된 값을 확인하려면 아래와 같은 SELECT 쿼리를 실행하면 됩니다.
mysql> Select * from Student; +----+-------+ | Id | Name | +----+-------+ | 1 | Raman | | 2 | Rahul | | 3 | Ram | | 4 | Mohan | | 5 | Aryan | +----+-------+ 5 rows in set (0.00 sec)
테이블을 살펴보면 마지막으로 삽입된 행의 Id 값은 5입니다. 따라서 많은 개발자는 LAST_INSERT_ID()가 5를 반환할 것이라고 기대하기 쉽습니다. 그러나 실제로 이 함수를 실행하면 다음과 같이 3이 반환됩니다.
mysql> Select Last_Insert_Id(); +------------------+ | Last_Insert_Id() | +------------------+ | 3 | +------------------+ 1 row in set (0.00 sec)
결과가 3인 이유는, 위의 다중 행 삽입 쿼리에서 가장 먼저 삽입된 행(Ram)의 Id 값이 3이기 때문입니다. 즉, 하나의 INSERT 문으로 여러 행을 동시에 삽입하면 LAST_INSERT_ID()는 마지막 행이 아니라 첫 번째 행에 부여된 AUTO_INCREMENT 값을 기준으로 동작합니다.
이러한 동작 방식은 복제(Replication) 환경에서 일관성을 유지하고, 단일 INSERT 문이 항상 하나의 시퀀스 값만 생성하도록 보장하기 위해 설계된 것입니다. 따라서 다중 행 삽입 후 각 행의 ID가 필요하다면 LAST_INSERT_ID()만으로는 전체 범위를 알 수 없으므로, 반환된 값부터 연속된 ID 범위를 직접 계산하거나 별도의 방법을 사용해야 합니다.