как запретить автоинкременту пропускать идентификационные номера в базе данных mysql?

#php #mysql #html #forms #passwords

#php #mysql #HTML #формы #пароли

Вопрос:

Хорошо, допустим, у меня есть таблица базы данных mysql с двумя столбцами, один из которых предназначен для id, а другой — для пароля. Если у меня есть три строки данных, а значения идентификаторов варьируются от 1 до 3, и я удаляю строку 3, а затем создаю другую строку данных, я увижу id = 4 вместо id = 3 во вновь созданной строке. Я знаю, что это связано со значением автоинкремента, но мне было интересно, могу ли я добавить некоторый код в php-файл, который автоматически сбросит все идентификационные номера таким образом, чтобы вы начинали с id = 1 и переходили к последнему идентификационному номеру с шагом 1 после удаления строки?

Моя цель — создать форму, в которой пользователь вводит пароль, и система сопоставит пароль со значением пароля в базе данных. При наличии совпадения строка с соответствующим паролем будет удалена, а столбец с идентификационными номерами будет переупорядочен таким образом, чтобы идентификационные номера не пропускались.

Обновление: я создаю систему вращающихся рекламных баннеров, устанавливая случайное число от 1 до 4 в переменную, чтобы php-файл извлекал случайное объявление от id = 1 до id = 4 с помощью переменной random number. Если случайным числом окажется 3, а id = 3 не существует, в строке рекламных баннеров появится пробел. Если есть способ обойти большие пробелы в этой ситуации, пожалуйста, скажите мне. заранее спасибо

Комментарии:

1. Почему вы хотите, чтобы они были переупорядочены? (Помимо того факта, что это невозможно)

2. Как сказал Тим, плохая идея.

3. Не могли бы вы, пожалуйста, объяснить, почему вы хотите это сделать? Я не думаю, что это вероятно — но, возможно, мы что-то пропустили?

4. Я использую цикл for для создания вращающихся рекламных баннеров. Я создал переменную для случайного отображения объявлений, например, от id = 1 до id = 4. Проблема в том, что если id = 3 не существует, в столбце объявлений будет отображаться пустой пробел, если система попытается извлечь «объявление 3», когда случайная переменная получит значение 3. Я не зациклен на устранении пробелов, ребята, лол.

5. возможно, вместо использования цикла for вы можете использовать столбец ‘next’?

Ответ №1:

Просто выполните следующий SQL-запрос:

 ALTER TABLE `tbl_name` AUTO_INCREMENT = 1;
  

… но это звучит как ужасная идея, так что не делайте этого. Почему значение вашего первичного ключа так важно? Уникальность гораздо важнее, и ее сброс подрывает это.

Ответ №2:

Вы можете использовать только

 ALTER TABLE 'tbl' AUTO_INCREMENT=#
  

для сброса на число, превышающее наибольшее значение number. Если у вас есть 1, 2, 3 и вы удаляете 2, вы не можете использовать это для заполнения 2. Если вы удалите 3, вы могли бы использовать это для повторного использования 3 (при условии, что вы не установили ничего выше). Это лучшее, что вы можете сделать.

Ответ №3:

 ALTER TABLE 'table' AUTO_INCREMENT = 1;
  

Однако запуск этого кода — не лучшая идея. Что-то не так с вашим приложением, если вы зависите от столбца, не имеющего пробелов. Вы пытаетесь подсчитать количество пользователей? если это так, используйте COUNT (id)? Вы пытаетесь работать с другими таблицами? Если это так, используйте внешний ключ.

Если вы решительно настроены сделать это неправильным способом, вы могли бы попытаться найти наименьшее свободное число и выполнить увеличение самостоятельно. Однако имейте в виду условия гонки.

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

Комментарии:

1. Я отмечаю, что при использовании 1 будет найдено минимально возможное число. Это не должно вызывать проблем.

Ответ №4:

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

 INSERT INTO person VALUES(1,'John','Smith','jsmith@devnull.fake',' 19995559999');
  

И если нет столкновения первичных ключей (в базе данных нет записи с id = 1), то MySQL с радостью выполнит это.

ALTER TABLE 'tbl' AUTO_INCREMENT=# Это тоже работает, и означает, что вам не нужно отслеживать счетчик.

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

Ответ №5:

Вы могли бы сделать это с помощью:

  1. Изобретение механизма, который предоставляет следующий доступный идентификатор, когда вы хотите вставить (например, транзакция, включающая чтение и увеличение где-либо целочисленного столбца — обратите особое внимание на уровень изоляции транзакции!)
  2. Использование UPDATE для уменьшения всех идентификаторов, превышающих тот, который вы только что удалили (опять же, с транзакцией — не забывайте, что внешние ключи должны быть В КАСКАДЕ ОБНОВЛЕНИЯ!)

Но возникает вопрос: зачем вам это нужно? стоит ли это того?

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

Обновление (для устранения комментария):

Чтобы выбрать случайное количество строк, вы можете сделать, например, в MySQL

 SELECT id FROM banners ORDER BY RAND() LIMIT 5
  

чтобы выбрать 5 случайных, гарантированно существующих идентификаторов баннера.

Небольшое предостережение: есть довольно много людей, которые считают ORDER BY RAND() , что это снижает производительность. Однако, ИМХО, не совсем правильно помещать каждый случай в одну корзину. Если количество строк в таблице управляемо (я бы посчитал, что все, что меньше 10 КБ, не так уж много), то ORDER BY RAND() это очень хорошее и лаконичное решение. Кроме того, сама документация предлагает такой подход:

Однако вы можете извлекать строки в произвольном порядке следующим образом:

mysql> SELECT * FROM tbl_name ORDER BY RAND();

ПОРЯДОК По RAND() в сочетании с LIMIT полезен для выбора случайной выборки из набора строк:

mysql> ВЫБЕРИТЕ * ИЗ table1, table2, ГДЕ a = b И c ПОРЯДОК По RAND() ОГРАНИЧЕНИЕ 1000;

RAND () не предназначен для того, чтобы быть идеальным генератором случайных чисел. Это быстрый способ генерации случайных чисел по требованию, переносимый между платформами для одной и той же версии MySQL.

Комментарии:

1. Я создаю систему вращающейся баннерной рекламы, задавая случайное число от 1 до 4 в переменную, чтобы php-файл извлекал случайное объявление от id = 1 до id = 4 с помощью переменной random number. Если случайным числом окажется 3, а id = 3 не существует, в строке рекламных баннеров появится пробел. Если есть способ обойти большие пробелы в этой ситуации, пожалуйста, скажите мне.

2. В дополнение к отображению строки или столбца случайных объявлений, мне нужно убедиться, что объявления не повторяются. Другими словами, это не приведет к появлению таких экземпляров, как «объявление 1, объявление 2, объявление 1, объявление 4», где объявление 1 появляется дважды на одной странице. Если ваш ответ уже предоставляет решение этой проблемы, то простите меня, потому что я просмотрел его: D.