2013-09-23 2 views
0

Быстрый вопрос:MySQL - Вставить строку без прерывания AUTO_INCREMENT

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

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

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

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

ответ

2

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

1

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

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

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

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

+0

«Что делать, если вы вставляете строку с id 5, но ваша таблица имеет 1 миллиард строк больше, чем id 5?» Точно .. какая боль в заднице! Большое спасибо за вашу полезную обратную связь. – 712Jefferson

Смежные вопросы