Проблема с автоинкрементным столбцом "id" - PullRequest
5 голосов
/ 18 июня 2011

Моя таблица БД выглядит следующим образом. http://prntscr.com/22z1n

Недавно я создал страницу delete.php. он работает нормально, но когда я удалил 21-го пользователя, следующий зарегистрированный пользователь получает 24-й идентификатор вместо 21.

Можно ли поместить информацию о недавно зарегистрированных пользователях в первую пустую строку? (В этой ситуации 21-й ряд)

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

Для этой цели я использую mysql_insert_id во время регистрации, чтобы получить идентификатор для нового пользователя. Но после удаления 21-й строки в процессе регистрации nex mysql_insert_id дал мне номер 21. но сохранился в 24-й строке. И положить в таблицу ассоциаций 21 для нового пользователя. Я хочу решить эту проблему

Ответы [ 6 ]

3 голосов
/ 18 июня 2011

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

2 голосов
/ 18 июня 2011

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

2 голосов
/ 18 июня 2011

Столбец MySQL auto_increment поддерживает внутреннее число и всегда будет увеличивать его, даже после удаления. Если вам нужно заполнить пустое пространство, вам придется обрабатывать его самостоятельно в PHP, а не использовать ключевое слово auto_increment в определении таблицы.

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

auto_increment можно сбросить с помощью оператора SQL, но это не рекомендуется, поскольку это приведет к ошибкам дублирования ключа.

-- Doing this will cause problems!
ALTER table AUTO_INCREMENT=12345;

EDIT Чтобы обеспечить соблюдение ваших отношений с внешним ключом, как описано в комментариях, вы должны добавить в определение таблицы:

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL;

Введите правильные имена таблиц и столбцов. Теперь, когда пользователь удаляется из регистрации, его ассоциация друзей обнуляется. Если вам нужно повторно связаться с другим пользователем, это должно быть обработано с помощью PHP. mysql_insert_id() больше не помогает.

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

SELECT MAX(id) FROM registration_table;
1 голос
/ 18 июня 2011

Не рекомендуется сбрасывать значение auto_increment, но если вам действительно нужно это сделать, вы можете:

ALTER TABLE mytable AUTO_INCREMENT = 1;

Запускать этот запрос после каждого удаления.Значение Auto_increment не будет установлено на 1, автоматически будет установлено минимально возможное значение.

1 голос
/ 18 июня 2011

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

Таким образом вы избежите проблем, которые могут возникнуть при работе со столбцом auto_increment.

1 голос
/ 18 июня 2011

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

...