Другие языки программирования и технологии

Вопрос по полю в MySQL

Добрый вечер. Мне нужна помощь. Возможно ли в MySQL создать толбец, который всегда будет занимать первое пустое числовое значение? Т.е., допустим, auto_increment работает так: Я поставил столбцу ID это значение. Он будет заполняться так: 1 2 3 ... 182 183 184 185 Допустим, я удалил поле с ID 183. Но если я создам новое поле, то ему будет присвоено не 183 а 186, т.е. увеличится максимальное число ID на единицу. Мне же надо, что бы ему присвоилось первое пропущенное значение, т.е. 183. Как это сделать?
MO
Maks Ogogo
184
Никак. Можно навесить триггеры, но тогда это поле перестанет быть PK и обязательным. Можно сделать отдельное поле типа sub_id, в которое записывать данные в триггере, повешенном на инсерт.
Андрей Кононенко
Андрей Кононенко
2 511
Лучший ответ
У таблиц есть два типа первичных ключей. Первый - фактический. Это например так.

Таблица "города" ID, Name

MSK, Moscow
SPB, Санкт-Петербург
MNSK, Минск

В этом случае поле ID редактируется оператором. Указав код MSK в таблице ищется MSK.

Есть ещё суррогатные ключи. Это у вас стоит генератор чисел, и он подставляет ID следующий за выданным в последний раз.

Лучше всего работают суррогатные ключи, потому что нет риска что значение будет случайно отредактировано при работе оператора. Пострадают внешние связи.. . Больше ни для чего этот ID не применяется. Не важно что там, 543434 или красивое 125 следующее за 124.
можно но не нужно
не нужно - получается существенная нагрузка на сервис
можно через скрипт php & mysql увеличивать переменную и сверять
Хо-хо.. . Не знаю, может как-то и можно это делать "без лишнего кода", но мне что-то выхода не видится, кроме как при удалении записи где-то сохранять ID удалённой записи, после чего, при добавлении записи, принудительно менять ID на сохранённый ID.
___________
upd: не надо ничего перебирать! Если нет желания сохранять ID удаляемой строки во внешний файл, то можно поступить вот как.. . Сделать таблицу, состоящую из одного поля, числового. И при удалении записи в основной таблице, загонять ID удаляемой записи во вторую таблицу. После чего делать примерно такой алгоритм на добавление записи.
ЕСЛИ кол-во записей во второй таблице больше 0, ТО ID добавляемой записи равен ПЕРВАЯ_ЗАПИСЬ_ВТОРОЙ _ТАБЛИЦЫ, после чего первую запись второй таблицы удаляем. Как-то так, да.