본문 바로가기
MySql

MySQL MySql INSERT MAX () + 1 문제

by 베이스 공부 2021. 1. 5.
반응형

많은 사용자가 포함 된 단일 테이블이 있습니다. 이 테이블에는 user_id (INT)라는 열이 있는데, 각 사용자에 대해 개별적으로 증가시키고 싶습니다. user_id는 1부터 시작해야합니다.

간단한 예를 준비했습니다.

Showing all names
+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 1            | Marry                 |
| 2            | Bob                   |
| 1            | John                  |
| 3            | Bob                   |
| 2            | Marry                 |
+--------------+-----------------------+


Showing only where name = Bob
+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 2            | Bob                   |
| 3            | Bob                   |
+--------------+-----------------------+

다음 쿼리는이를 수행하지만 테이블에 'Bob'이 이미있는 경우에만 작동합니다.

INSERT INTO users(user_id, name) SELECT(SELECT MAX(user_id)+1 from users where 
name='Bob'), 'Bob';

Bob이없는 경우 (첫 번째 항목) user_id는 0 (영)으로 설정됩니다. 이게 문제 야. 0이 아닌 1부터 시작하려면 user_id가 필요합니다.

 

해결 방법

 

다음과 같이 사용할 수 있습니다.

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

그러나 이러한 쿼리는 경쟁 조건으로 이어질 수 있습니다. 트랜잭션에 있는지 확인하고 실행하기 전에 사용자 테이블을 잠급니다. 그렇지 않으면 동일한 번호를 가진 두 명의 Bob이 생길 수 있습니다.

 

참조 페이지 https://stackoverflow.com/questions/1587562

 

 

반응형

댓글