MySQL — вставить строку, не нарушая AUTO_INCREMENT

Быстрый вопрос:

У меня есть база данных спортивной лиги со списком игр (скажем, около 40). Каждой игре автоматически присваивается идентификационный номер в качестве основного ключа при импорте всего расписания из электронной таблицы. Затем игры отображаются на веб-странице в порядке убывания благодаря этому невидимому (для пользователя) первичному ключу. Вот пример: Расписание лиги

Работает отлично. Единственная проблема заключается в том, что иногда игры переносят и переносят на более позднюю дату или добавляют новую игру, которую необходимо вставить в уже существующее расписание. До сих пор мне приходилось вручную редактировать идентификатор каждой затронутой строки (используя PhpMyAdmin), чтобы учитывать изменения, и это может быть довольно утомительным и трудоемким.

Что я действительно хотел бы сделать, так это настроить таблицу для корректировки значений первичного ключа на лету. Это означает, что если я вставлю совершенно новую игру в пятую строку таблицы, все последующие игры будут автоматически перенастроены (ID 5 станет 6, ID 6 станет 7 и так далее).

Есть ли способ настроить таблицу для этого или конкретную команду SQL, которую я могу использовать для этого? Извиняюсь, если это уже спрашивали много раз по-разному. Любая обратная связь приветствуется.


person 712Jefferson    schedule 23.09.2013    source источник


Ответы (2)


Вы не должны использовать свой ПЕРВИЧНЫЙ КЛЮЧ для этого. Добавьте специальный столбец, например sort, с обычным INDEX, а не UNIQUE. Это не обязательно должно быть INT, вы можете использовать действительные числа< /а>. Таким образом, вы всегда сможете вставить новую строку между любыми двумя строками вашего расписания.

person Leo Nyx    schedule 23.09.2013

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

Попытка настроить значения не только неудобна и неудобна вручную, но и чревата условиями гонки, иначе требуют блокировки большого количества строк. Что, если вы вставите строку с идентификатором 5, но в вашей таблице 1 миллиард строк больше, чем идентификатор 5?

Также существует риск перенумерации столбцов первичного ключа, потому что любой пользователь, получивший электронное письмо с сообщением о том, что ему нужно перейти к игре 42, может в конечном итоге перейти к неправильной игре.

Если вам нужно просмотреть строки в определенном порядке (например, в хронологическом порядке), используйте для этого столбец DATE, а не столбец с автоинкрементом.

person Bill Karwin    schedule 23.09.2013
comment
Что, если вы вставите строку с идентификатором 5, но в вашей таблице 1 миллиард строк больше, чем идентификатор 5? Точно.. какая заноза в заднице! Большое спасибо за ваш полезный отзыв. - person 712Jefferson; 23.09.2013