[1. 개요]
mysql 에서 제공하는 함수(?) LAST_INSERT_ID() 는
가장 최근에 성공적으로 수행된 INSERT 구문에 대해서 (update, delete 등 에는 영향받지 않음)
자동으로 생성 되는 AUTO_INCREMENT 인 column 의 값을 반환한다.
이 때, 주의할 점은 다음과 같다.
- 단순 insert 여러 번 수행 후 결과와 bulk insert 수행 후 결과는 다르다.
- 서버 연결 후, 별도의 insert 구문이 없으면 항상 0이 반환된다.
- LAST_INSERT_ID() 의 반환 값은 mysql server 에 연결 된 세션 별로 다를 수 있다.
- 가장 마지막에 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 |