2017-01-12 3 views
1

У меня есть запрос, который использует подзапрос, чтобы определить идентификатор строки, которую нужно вставить. Цель состоит в том, чтобы увеличить каждую новую строку до следующего кратного значения , позволяя щедро разделить между идентификаторами. Возможно ли, что идентификатор, возвращаемый подзапросом, уже может быть принят другим параллельным процессом? Или этот подзапрос гарантированно создает уникальный идентификатор, как если бы он был автоматическим приращением?Могут ли результаты подзапроса быть устаревшими?

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

Если бы это был нормальный подзапрос, я бы сказал, что это, безусловно, атомная (при условии, InnoDB). Но мне интересно, верно ли это для вложенного подзапроса. – shmosel

+0

Поскольку это технически [«объемная вставка»] (http://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-lock-mode -consecutive), MySQL по умолчанию блокирует всю таблицу. Если это не достаточно разумно, чтобы понять, что вы выбираете только одну строку. – shmosel

+0

hmm ... Я бы подумал, что это простая вставка, но определение действительно исключает вложенный подзапрос. – billynoah

ответ

1

Если вы делаете это только для установки интервала между идентификаторами, вы должны использовать:

SET @@auto_increment_increment=1000; 

Это убедитесь, что последующие значения автоматического приращения являются 1000 номеров друг от друга. Это принудительное исполнение на уровне двигателя, поэтому вам не нужно беспокоиться о гоночных условиях.

Более подробная информация здесь: https://dev.mysql.com/doc/refman/5.6/en/replication-options-master.html#sysvar_auto_increment_increment

+0

спасибо, но идентификатор должен быть следующим * кратным 1000 *, а не 1000 друг от друга. Поскольку другие аспекты приложения допускают идентификаторы между результатом, должно быть что-то вроде этого: 1000, 2000, 2001, 2002, 3000, 4000, 4001 и т. Д. – billynoah