본문 바로가기

MySQL

MySQL. LAST_INSERT_ID

[1. 개요]

mysql 에서 제공하는 함수(?) LAST_INSERT_ID() 는

가장 최근에 성공적으로 수행된 INSERT 구문에 대해서 (update, delete 등 에는 영향받지 않음)

자동으로 생성 되는 AUTO_INCREMENT 인 column 의 값을 반환한다.

 

이 때, 주의할 점은 다음과 같다.

  1. 단순 insert 여러 번 수행 후 결과와 bulk insert 수행 후 결과는 다르다.
  2. 서버 연결 후, 별도의 insert 구문이 없으면 항상 0이 반환된다.
  3. LAST_INSERT_ID() 의 반환 값은 mysql server 에 연결 된 세션 별로 다를 수 있다.
  4. 가장 마지막에 insert 한 table 의 auto_increment 된 값을 반환한다.

[2. 특징]

개요에서 정리한 주의 점에 대해서 좀 더 상세히 정리하도록 한다.

먼저 테스를 위한 쿼리는 아래와 같다.

create database test;

use test;

CREATE TABLE `mytable` (
  `id` INT(11) NOT NULL AUTO_INCREMENT, ##
  `col` VARCHAR(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1;

# 2.1

# bulk insert
INSERT INTO mytable(col) VALUES('a'),('b'),('c');
select last_insert_id(); # output => 1

# single insert
INSERT INTO mytable(col) VALUES('d');
INSERT INTO mytable(col) VALUES('e');
INSERT INTO mytable(col) VALUES('f');
select last_insert_id(); # output => 6

table 이 비어있는 상태에서 시작한다고 가정한다.

 

bulk insert 를 통해 한번에 3개의 row 를 생성하였는데, last_insert_id() 의 결과는 1이다.

=> mysql 공식문서(?) 에는 insert 구문에서 첫번째로 자동 생성된 값을 반환한다고 되어 있다.

=> bulk insert 로 여러 개의 row 를 삽입 하지만 가장 먼저 반영 된 row 는 'a' 이고, 

=> 이 row 의 id 값은 auto_increment 로 1이 된다.

 

single insert 여러 개를 수행하면, 매 insert 마다 last_insert_id() 가 갱신 된다.

총, 6개의 record 가 있으므로 6이 된다.


# 2.2

exit;
# mysql -u root -p'test'
use test;
select last_insert_id(); #output => 0

INSERT INTO mytable(col) VALUES('g');
select last_insert_id(); #output => 7

mysql 재접속 후, last_insert_id() 를 수행하면 0이 출력 된다.

한번의 insert 를 수행 후, 다시 확인하면 7이 출력되는 것을 확인 할 수 있다.


# 2.3

다른 세션으로 db 접속 후, 확인 해보면 0 이 출력 된다.

기존 세션을 session_1, 새로운 세션을 session_2 라 하면,

 

session_2 에서 아래 쿼리를 수행한다.

use test;
INSERT INTO mytable(col) VALUES('h');
select last_insert_id(); #output => 8

session_1 에서 last_insert_id() 를 확인하면 7 이 출력 된다.


# 2.4

session_1 에서 아래 쿼리를 수행하도록 한다.

CREATE TABLE `yourtable` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `col` VARCHAR(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB AUTO_INCREMENT=1

select last_insert_id()  #output => 7


INSERT INTO yourtable(col) VALUES('d');
select last_insert_id()  #output => 1


INSERT INTO yourtable(col) VALUES('k');
INSERT INTO mytable(col) VALUES('k');
select last_insert_id()  #output => 9

[3. 그밖에 특징]

아래 쿼리 결과는 'any_table' 의 행 개수만큼 last_insert_id() 결과가 출력 되며, 의미가 없다고 볼 수 있다.

 

SELECT LAST_INSERT_ID() 

FROM 'any_table'


unique key 등으로 인해 duplicate entry 에 대해서 중복 체크가 가능하며, 

여기서 innodb_autoinc_lock_mode 에 따라서 auto_increment 가 내부적으로만 갱신 되는 경우,

LAST_INSERT_ID() 의 결과는 내부적으로 갱신되는 값을 따라 간다.


[4. 그밖의 사용 방법]

아래와 같이 사용 시

LAST_INSERT_ID() 로 넘긴 argument 의 값이 반환된다.

즉, LAST_INSERT_ID() 로 3이 반환 된다면,

LAST_INSERT_ID(id+1) 은 4가 반환 된다는 것이다.

 

카운터 기능을 하게 할 수 있다.


[5. 참조]

https://cirius.tistory.com/1139

https://dev.mysql.com/doc/refman/8.0/en/information-functions.html#function_last-insert-id

'MySQL' 카테고리의 다른 글

MySQL, innodb_autoinc_lock_mode  (0) 2023.06.21
MySQL, SQL_SAFE_UPDATES  (0) 2023.06.15
mysql 공간 쿼리  (0) 2023.05.24
partition 에 대해서  (0) 2022.10.04
MariaDB 설치 및 계정 관리  (0) 2022.04.01