У меня есть запрос, который использует подзапрос, чтобы определить идентификатор строки, которую нужно вставить. Цель состоит в том, чтобы увеличить каждую новую строку до следующего кратного значения , позволяя щедро разделить между идентификаторами. Возможно ли, что идентификатор, возвращаемый подзапросом, уже может быть принят другим параллельным процессом? Или этот подзапрос гарантированно создает уникальный идентификатор, как если бы он был автоматическим приращением?Могут ли результаты подзапроса быть устаревшими?
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
)
Если бы это был нормальный подзапрос, я бы сказал, что это, безусловно, атомная (при условии, InnoDB). Но мне интересно, верно ли это для вложенного подзапроса. – shmosel
Поскольку это технически [«объемная вставка»] (http://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-lock-mode -consecutive), MySQL по умолчанию блокирует всю таблицу. Если это не достаточно разумно, чтобы понять, что вы выбираете только одну строку. – shmosel
hmm ... Я бы подумал, что это простая вставка, но определение действительно исключает вложенный подзапрос. – billynoah