안내
본 문서는 블로그의 운영자인 본인이 Stackoverflow에 올린 답변을 정리한 글입니다.
Stackoverflow URL
다음과 같은 INSERT 문을 이용하여 SELECT의 결과를 테이블에 INSERT하고 있다.
INSERT INTO tab
SELECT LAST_INSERT_ID(), B.id, C.name, C.address,
FROM sample_table C JOIN other_table B ON B.phoneNumber = C.phoneNumber;
첫 번째 컬럼이 AUTO_INCREMENT 컬럼인데 위와 같이 SELECT 시에 LAST_INSERT_ID()
를 지정했는데도 자동 증가된 값이 INSERT되지 않고 있다. LAST_INSERT_ID()
는 계속하여 1만 반환하고있다. 무엇이 문제인가?
질문
답변
LAST_INSERT_ID()
함수는 가장 최근에 AUTO_INCREMENT 컬럼에 할당되었던 값을 반환하는 함수일 뿐, 앞으로 할당될 값을 반환하는 함수가 아니다. INSERT 시에 AUTO_INCREMENT 컬럼에 NULL값을 부여하여 생성되는 매 레코드마다 새로운 값이 할당되도록 할 수 있다.
INSERT INTO A
SELECT NULL, B.id, C.name, C.address
FROM sample_table C JOIN other_table B ON B.phoneNumber = C.phoneNumber;
혹은 INSERT 문에 컬럼 명을 명시적으로 적되, AUTO_INCREMENT 컬럼 명만 제외하는 것도 방법이다.
INSERT INTO A (bid, name, address)
SELECT B.id, C.name, C.address
FROM sample_table C JOIN other_table B ON B.phoneNumber = C.phoneNumber;
“MySQL” 카테고리의 추천 글
- MySQL IN subquery 성능. IN sub query는 가급적 사용을 피하자
- MySQL의 IN() v.s. EXISTS v.s. INNER JOIN 성능 비교
- MySQL INNER JOIN v.s EXISTS 성능 비교
- JOIN에서 중복된 레코드 제거하기
- MySQL 중복 레코드 관리 방법 - INSERT IGNORE, REPLACE INTO, ON DUPLICATE UPDATE
- MySQL GROUP BY 성능 최적화를 위한 INDEX 설계
- MySQL Query Cache를 빠르게 비우기
- MySQL Plugin에 대한 간단한 소개
- MySQL InnoDB Index Statistics
- MySQL Foreign key 사용 시 주의 사항 (Can’t create table (errno: 150))