2017-01-12 3 views
1

하위 쿼리를 사용하여 삽입 할 행의 ID를 결정하는 쿼리가 있습니다. 목표는 각 새 행을 의 다음 배수로 증가 시켜서 ID 사이에 충분한 간격을 허용하는 것입니다. 하위 쿼리에 의해 반환 된 id가 이미 다른 동시 프로세스에서 가져올 수 있습니까? 또는이 하위 쿼리가 자동 증분 인 것처럼 고유 ID를 생성하도록 보장됩니까? 당신이이 일을하는 경우하위 쿼리 결과가 오래 될 수 있습니까?

INSERT INTO `table` 
SET id = (
    SELECT x.max_id 
    FROM (
     SELECT MAX(id) + 1000 as max_id 
     FROM `table` 
     WHERE id LIKE '%000' 
    ) as x 
) 
+0

는 일반 하위 쿼리가 있었다면, 나는 그것이 확실히 원자 말할 것이다 (가정 이노). 하지만 중첩 된 하위 쿼리에 해당하는지 여부가 궁금합니다. – shmosel

+0

이것은 기술적으로 [ "bulk insert"] (http://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-lock-mode)이므로 -consecutive), MySQL은 기본적으로 전체 테이블을 잠급니다. 단 하나의 행만 선택한다는 것을 깨닫기에 충분히 똑똑하지 않은 한. – shmosel

+0

흠 ... 나는 그것이 단순한 삽입이라고 생각 하겠지만 정의는 중첩 된 서브 쿼리를 배제한다. – billynoah

답변

1

단지 ID 사이의 간격을 설정하는 대신 사용해야합니다

SET @@auto_increment_increment=1000; 

이 확실 이후의 자동 증가 값이 떨어져 1000 개 번호가 만들 것입니다. 이것은 엔진 수준에서 시행되므로 경쟁 조건에 대해 걱정할 필요가 없습니다. 여기

더 많은 정보 : https://dev.mysql.com/doc/refman/5.6/en/replication-options-master.html#sysvar_auto_increment_increment

+0

감사합니다.하지만 id는 1000 *이 아닌 1000 *의 다음 배수 여야합니다. 응용 프로그램의 다른 측면은 1000, 2000, 2001, 2002, 3000, 4000, 4001 등과 같이 결과 사이에 ID를 허용하기 때문에 – billynoah

관련 문제