Auto_increment оценивает в InnoDB?

Я использовал InnoDB для проекта и полагался на auto_increment. Это не проблема для большинства таблиц, но для таблиц с удалением, это могло бы быть проблемой:

Обработка AUTO_INCREMENT в InnoDB

особенно эта часть:

Столбец AUTO_INCREMENT, названный ai_col: После запуска сервера, для первой вставки в таблицу t, InnoDB выполняет эквивалент этого оператора: ВЫБЕРИТЕ МАКСА (ai_col) ИЗ t FOR UPDATE; InnoDB увеличивает одним значение, полученное оператором, и присваивает его столбцу и автоинкрементному счетчику для таблицы.

Это - проблема потому что, в то время как она гарантирует, что в таблице, ключ уникален, существуют внешние ключи к этой таблице, где те ключи больше не уникальны.

mysql сервер/должен не часто, перезапускают, но это повреждается. Есть ли какие-либо простые способы вокруг этого?

8
задан Timmy 28 December 2009 в 23:54
поделиться

4 ответа

Если у вас ограничение постороннего ключа, как можно удалить строку из таблицы A, когда таблица B ссылается на эту строку? Мне это кажется ошибкой.

Независимо от этого, вы можете избежать повторного использования значений автоинкремента, сбросив смещение при запуске резервной копии вашего приложения. Запрос на максимальное значение во всех таблицах, которые ссылаются на таблицу A, затем измените таблицу выше этого максимального значения, например, если максимальное значение равно 989, используйте следующее:

alter table TableA auto_increment=999;

Также остерегайтесь, что разные MySQL движки имеют разное поведение автоинкремента. Этот трюк работает для InnoDB.

.
3
ответ дан 5 December 2019 в 21:19
поделиться

Итак, у вас две таблицы:

TableA

A_ID [PK]

и

TableB

B_ID [PK]

A_ID [FK, TableA.A_ID]

А в TableB значение A_ID не уникально? Или в TableB.A_ID есть значение, которого нет в TableA.A_ID?

Если вам нужно, чтобы значение TableB.A_ID было уникальным, то вам нужно добавить ограничение UNIQUE в этот столбец.

Или я все еще что-то пропустил?

.
1
ответ дан 5 December 2019 в 21:19
поделиться

Использовать ограничение по внешнему ключу с 'SET NULL' для обновления и удаления.

.
1
ответ дан 5 December 2019 в 21:19
поделиться

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

1
ответ дан 5 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: