개발/Database

[MariaDB] last_insert_id() 사용 시 주의점

Hide 2025. 5. 29. 23:07

 auto_increment와 last_insert_id() 사용 시 주의점

 

auto_increment란 DB 테이블 컬럼에 자동으로 증가하는 값이다.

last_insert_id()는 테이블의 마지막 auto_increment 값을 리턴한다. 

 

DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `test` VARCHAR(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO test(col) VALUES('a'),('b'),('c');


SELECT last_insert_id();


위 순서대로 쿼리 실행 시 last_insert_id는 3일 것으로 예상 하였으나 1이 반환됨. 


DROP TABLE IF EXISTS `test`;

CREATE TABLE `test` (
  `id` INT(10) NOT NULL AUTO_INCREMENT,
  `test` VARCHAR(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO test(col) VALUES('a')
INSERT INTO test(col) VALUES('b')
INSERT INTO test(col) VALUES('c')

SELECT last_insert_id();

  위 순서대로 쿼리 실행 시 last_insert_id는 3으로 반환된다.

 

insert 되는 데이터는 같은데 last_insert_id는 차이가 난다. last_insert_id 함수는 1개 insert에 대해 성공 시 마지막 auto_increment 값을 반환한다. 위 insert는 1개이므로 반환값이 1, 아래는 3번 했으므로 3. 

그리고 INSERT 3번 진행 후, last_inserjt_id가 3인 상황에서 트랜잭션 사용하여 ROLLBACK 동작 후, INSERT 시 LAST_INSERT_ID는 1이 아니라 4가 된다. 트랜잭션은 롤백되었지만 INSERT 자체는 정상적으로 수행되었고, 이로 인해 auto_increment 값은 증가하여 LAST_INSERT_ID()는 4가 된다.

 

트랜잭션을 사용하여 LAST_INSERT_ID() 의 반환값은 INSERT 수만큼 정상적으로 나오는데, DB에 데이터가 없는 현상이 있어 ORACLE DB에서는 문제없이 동작하는 쿼리가 MARIADB에서만 안되는게 이상하여 LAST_INSERT_ID()가 문제인가 하고 살펴보았다.