Понимание поведения MySQL при последующем добавлении автоинкрементного первичного ключа - PullRequest
0 голосов
/ 28 августа 2011

Допустим, у нас есть (InnoDB) таблица associations в базе данных MySQL, которая имеет следующую структуру:

CREATE TABLE `associations` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
  `fk_id_1` int(11) NOT NULL,
  `fk_id_2` int(11) NOT NULL,
  `fk_id_3` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
  UNIQUE KEY `some_unique_constraint` (`fk_id_1`,`fk_id_2`),
  KEY `fk_id_2_INDEX` (`fk_id_2`),
  KEY `fk_id_3_INDEX` (`fk_id_3`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin$$

В столбце id есть скачков (Я знаю, что это проблема того, как генерируется автоинкрементное значение, в то время как несколько потоков пытаются получить его).Поскольку ни одна другая таблица не использует столбец id в качестве ссылки, я планирую удалить столбец id и создать его снова, надеюсь, что счетные дыры исчезнут.Я сделал резервную копию своей базы данных и проверил это.Результат был немного запутанным.Порядок строк, казалось, изменился.Если я не ошибаюсь, сначала порядок будет fk_id_1, затем fk_id_2, затем fk_id_3.

. Это естественный порядок, в котором MySQL устанавливает таблицу, когда присваивает строкам новый сгенерированный ключ автоинкремента??

Есть ли еще что мне знать, что произошло во время этого процесса?

Причина, по которой я должен знать об этом, заключается в том, что мне нужно сделать столбец id полезным для другогозадание, которое я намерен выполнить там, где пробелы не нужны.

1 Ответ

4 голосов
/ 28 августа 2011

Нет естественного порядка для таблицы в любой основной RDBS.

Только самый внешний ORDER BY в операторе SELECT гарантирует порядок результатов.

Если вы хотите "заказать":

  • создать новую таблицу
  • INSERT..SELECT..ORDER BY fk_id_1, fk_id_2, fk_id_3
  • Оставить старый стол
  • Переименовать новую таблицу

Или жить с пробелами ... OCD не подходит для разработчиков

Edit:

Вопрос говорит "нет зависимости" от этого значения, но оказывается, что есть.

Если пропуски запрещены, не используйте autonumber и используйте fk_id_1, fk_id_2, fk_id_3 в качестве ключа с эмуляцией ROW_NUMBER Или код вашего нисходящего потока для устранения пробелов.

Автономные номера будут иметь пробелы: неизменный факт жизни.

...