php: самый быстрый способ сгенерировать 5-значное число, которого еще нет в столбце базы данных MySQL (с уникальным атрибутом)

Предположим, что Table1 содержит столбец orderid (не ключ, хотя он НЕ NULL и уникален). Он содержит 5-значные числа. Каков наилучший способ создать php var $unique_var, которого нет в этом столбце. Что может быть важно, от 10% до 30% 5-значных чисел находятся в таблице (поэтому генерация числа и проверка while (mysql_num_rows() ==0) {} - не лучший способ найти его, есть ли лучшее решение для производительности?).

Спасибо.


person Haradzieniec    schedule 04.12.2011    source источник
comment
Я знаю, что это может быть не то, что вам нужно, но вы можете определить свой ключевой столбец как столбец auto_increment и установить начальное значение для auto_increment равным 10 000. Затем у вас будет до 100 000 номеров, и база данных сделает всю работу за вас, когда вы добавите новую строку. Я предполагаю, что вы не считаете 09999 или меньше пятизначным числом для ваших целей.   -  person dash    schedule 05.12.2011
comment
есть ли какая-то особая причина, по которой вы хотите сгенерировать число в PHP?   -  person Narcis Radu    schedule 05.12.2011
comment
это как порядковый номер - должен быть не просто 1,2,3, но также должен содержать некоторую дополнительную информацию, например, контрольную сумму (вид числа 39113 говорит о том, что число правильное, потому что 3+9+1=13 - последние два числа, и число не имеет ошибок или имеет не менее двух ошибок). Итак, когда человек говорит вам 39113, вы почти уверены, что он назвал вам правильный идентификатор заказа.   -  person Haradzieniec    schedule 05.12.2011


Ответы (3)


Если уже занято всего 10-30% номеров - значит, всего 10-30% запросов будут выполняться как минимум дважды. Что вообще не является большой проблемой производительности.

В противном случае - просто создайте таблицу со списком всех 5-значных чисел (всего 100 тыс. строк) и удалите все существующие. Когда вам нужно другое случайное число - просто выберите его и удалите.

person zerkms    schedule 04.12.2011
comment
Спасибо. Я думаю, что ловушка при использовании этого метода заключается в том, что могут быть сгенерированы два одинаковых 5-значных числа (до того, как первое было вставлено в таблицу). Один будет вставлен, другой будет неудачным. До сих пор не знаю, существует ли лучший способ... - person Haradzieniec; 05.12.2011
comment
@Haradzieniec: с отдельной таблицей, в которой хранится список еще неиспользованных номеров, у вас никогда не возникнет конфликта (пока вы блокируете строку или всю таблицу) - person zerkms; 05.12.2011
comment
Извините... Не могли бы вы объяснить, что вы имеете в виду, когда говорите заблокировать строку или всю таблицу? InnoDB является двигателем по умолчанию, если это важно. Спасибо. - person Haradzieniec; 05.12.2011
comment
@Haradzieniec: создайте таблицу с номерами 00001..99999 и удалите все уже используемые значения. Когда вам нужен другой номер - заблокируйте стол, выберите один номер, удалите его, разблокируйте стол. - person zerkms; 05.12.2011

Я бы предложил найти наибольшее число (с предложением MAX()) и начать оттуда.

person Sergio    schedule 04.12.2011
comment
Это не сработает, так как числа от 00001 до 99999 (ограничено 99999). Количество этих уникальных номеров никогда не превышает количество 5-значных чисел, даже 30% 5-значных чисел, но, к сожалению, этот метод не сработает. - person Haradzieniec; 05.12.2011

Вот несколько предложений. У каждого есть свои недостатки.

  1. Предварительно заполните таблицу и добавьте столбец, указывающий, что число не используется. Выберите неиспользуемый номер с помощью LIMIT = 1 и отметьте его как используемый. Это использует много места.
  2. Ведите отдельную таблицу с ранее использованными номерами. Если эта таблица пуста, сгенерируйте числа последовательно, начиная с последнего использованного числа (или с 00001, если таблица Table1 пуста). Это требует дополнительной бухгалтерии.
person Ted Hopp    schedule 04.12.2011