Что такое порядок значений полей auto_increment для оператора MySQL INSERT .. SELECT - PullRequest
1 голос
/ 29 октября 2019

Допустим, у нас есть следующая таблица:

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 об этой ситуации.

ОБНОВЛЕНИЕ: Я полагаю, что это может быть неверно в некоторых кластерных решениях, когда несколько экземпляров имеют собственный шаблон для значения автоинкремента, а один отстает, а выполнение запроса распределяется между некоторыми способами. Но у меня нет среды, чтобы это проверить.

1 Ответ

0 голосов
/ 29 октября 2019

После дальнейших исследований я отвечу на свой вопрос.

Я думаю, что в большинстве ситуаций это будет правдой, но я смог найти случаи, когда этот алгоритм мог вызвать проблемы. Первое упомянуто в моем ОБНОВЛЕНИИ к вопросу о кластерных решениях. Во-вторых, я могу представить себе ситуацию, когда в таблице есть пробелы в поле id - auto_increment (изначально начиналось с 1000000, а не 0), и во время выполнения оператора вставки значение auto_increment вручную изменялось на более низкое значение. Так что это нарушит шаблон auto_increment. Я бы предложил вместо этого использовать порядок по некоторым значимым полям, чтобы мы могли предсказать уникальность. Если их нет, то нет разницы, какую из 2-х идентичных записей, которые были только что вставлены, использовать.

Относительно вопроса из заголовка. Значения Auto_increment в одной массовой вставке в одном экземпляре MySQL обычно будут в порядке возрастания, но есть случаи, когда его можно прервать, если значение auto_increment изменилось на меньшее. Для кластерного решения это зависит от кластерной реализации и, скорее всего, будет также непредсказуемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...