[SQL] LAST_INSERT_ID()

배윤석·2022년 5월 26일
1

SQL

목록 보기
4/4
post-thumbnail

🥊 환경 정보

  • MariaDB : ver 10.6

🥊 LAST_INSERT_ID()

💧 기능

  • 마지막으로 INSERTAUTO_INCREMENT 속성으로 자동생성된 값을 return 한다.

💧 주의점

🎇 값의 초기화

  • DB 서버를 최초실행하거나, 재시작할 시 값이 초기화된다.
    - 초기값 : 0
SELECT LAST_INSERT_ID();
+------------------+
| last_insert_id() |
+------------------+
|                0 |
+------------------+

🎇 값의 리턴

  • 실행하는 콘솔별로 리턴되는 값이 틀리다.
    1. JDBC프롬프트
      • 프롬프트에서 값이 3으로 return 되었다고해서 JDBC의 값이 동일하게 3으로 나오지 않는다.
    2. 프롬프트프롬프트
      • 프롬프트1 값이 5이라도 프롬프트2에서 값이 5로 리턴되지 않는다.

🎇 TRUNCATE 사용 시

  • TRUNCATE는 테이블을 DROP 한 후 재생성한다.
    테이블이 재생성 되기 때문에, AUTO_INCREMENT 값은 리셋된다.
    다만, AUTO_INCREMENT 값은 리셋되더라도 LAST_INSERT_ID() 값은 리셋되지 않는다.
TRUNCATE TABLE 테이블명;

🎇 DELETE vs TRUNCATE

  • DELETE : 레코드 단위 row 삭제 ➡ AUTO_INCREMENT 유지
  • TRUNCATE : 테이블 삭제 후 재생성 ➡ AUTO_INCREMENT 초기화

💧 사용

🎇 질의응답 게시판

  • 질의응답 게시판은 다음의 구조를 갖는다.
    1. seq : 게시글 번호
    2. grp : 게시글 그룹
    3. grps : 게시글 그룹 내 순서
    4. grpl : 게시글 그룹 내 깊이
CREATE TABLE board1 (
  seq INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  grp INT NOT NULL,
  grps INT NOT NULL,
  grpl INT NOT NULL,
  subject VARCHAR(150) NOT NULL,
  writer VARCHAR(12) NOT NULL,
  password VARCHAR(12) NOT NULL,
  content VARCHAR(2000),
  wdate DATETIME NOT NULL
);
  • 최상위 게시글 작성 시 Query
    - 아래와 같이 INSERT 한다.
    1. seq : 자동증가
    2. grp : seq의 값과 동일
    3. grps : 최상위 글의 그룹 내 순서는 0
    4. grpl : 최상위 글의 그룹 내 깊이는 0
INSERT INTO rep_board1
	VALUES (0, last_insert_id()+1, 0, 0, '제목', '작성자', '1234', '내용', now());

🥊 초기값 지정하기

💧 LAST_INSERT_ID(변수)

최초 실행시 주의점에서 봤듯, LAST_INSERT_ID() 의 값은 0으로 초기화된다.
따라서 사용에서 본 최상위 게시글 작성시 Query를 별다른 처리 없이 맨 처음 사용하면 grp의 값이 1로 나오게 된다.
이때, LAST_INSERT_ID() 안에 초기값을 입력해주면 된다.

-- 최초 실행시
SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                0 |
+------------------+

-- 초기값 3 입력시
SELECT LAST_INSERT_ID(3);
+-------------------+
| LAST_INSERT_ID(3) |
+-------------------+
|                 3 |
+-------------------+

-- 다시 사용하면?
SELECT LAST_INSERT_ID();
+------------------+
| LAST_INSERT_ID() |
+------------------+
|                3 |
+------------------+

💧 MAX

MAX를 사용해 grp 값을 먼저 가져오는 방법도 있다.

SELECT MAX(seq)+1 grp
FROM board1;
profile
차근차근 한 걸음씩 걸어나가는 개발자 꿈나무.

0개의 댓글