Допустим, у нас есть следующая таблица:
CREATE TABLE test_insert_order (
id INT(11) NOT NULL AUTO_INCREMENT,
parent_id INT(11) NOT NULL,
name VARCHAR(20),
PRIMARY KEY (id)
);
С некоторыми данными, такими как
INSERT INTO test_insert_order (parent_id, name) VALUES (1, 'a'),(1, 'b'),(1,'c'),(2,'b'),(2,'d'),(2,'a'),(3,'d'),(3,'a'),(4,'aa'),(5,'bb'),(6,'a'),(3,'a'),(1,'d'),(2,'c');
Если мы сделаем
INSERT INTO test_insert_order (parent_id, name) SELECT 7, `name` FROM test_insert_order WHERE parent_id = 2 ORDER BY id;
Можем ли мы предположить, что новый auto_generatedИдентификаторы будут в том же порядке, что и идентификаторы в результате выбора
SELECT id, 7, `name` FROM test_insert_order WHERE parent_id = 2 ORDER BY id;
Таким образом, в результате следующий запрос a.name будет всегда соответствовать b.name
SET @i:=0;set @j:=0;
SELECT a.id, a.parent_id, a.name, a.order_id, b.id, b.parent_id, b.name, b.order_id FROM
(SELECT *, @j:=@j+1 as order_id FROM test_insert_order WHERE parent_id = 2 ORDER BY id) a,
(SELECT *, @i:=@i+1 as order_id FROM test_insert_order WHERE parent_id = 7 ORDER BY id) b
WHERE a.order_id = b.order_id;
Я сделал несколькотесты с параллельными ступенями, и это всегда так. Но я не могу найти ничего в MySQL Docs об этой ситуации.
ОБНОВЛЕНИЕ: Я полагаю, что это может быть неверно в некоторых кластерных решениях, когда несколько экземпляров имеют собственный шаблон для значения автоинкремента, а один отстает, а выполнение запроса распределяется между некоторыми способами. Но у меня нет среды, чтобы это проверить.