Генерировать уникальное 10-значное число

#mysql #numbers #unique

#mysql #числа #уникальный

Вопрос:

Я хочу генерировать идентификаторы клиентов для счетов-фактур и, следовательно, не хочу начинать отсчет с 1 по очевидным причинам. В MySQL вы можете сгенерировать случайное число, которое является уникальным?

Я знаю о функции RAND(), но она не гарантирует уникальность. Каков правильный подход для этого?

Не работает:

 INSERT INTO test (number) VALUES (FLOOR(0   (RAND() * 9999999999)));
  

PS: На стороне сервера я использую PHP и генерирую счета с использованием FPDF.

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

1. В чем здесь очевидная причина? Будут ли счета-фактуры каким-то образом доступны для просмотра, если вы угадаете следующий идентификатор, или их можно каким-то образом подделать? Если это так, у вас другая проблема, и вам нужно убедиться, что любой, кто просматривает счет, авторизован для этого. Вместо этого я бы посмотрел, используя функцию UUID (см. dev.mysql.com/doc/refman/5.0/en /… ), хотя это кажется большим перебором.

2. Нет, на самом деле я не рассматриваю ничего общего с подменой и т.д. Скорее всего, компания является начинающей, и они не хотят раскрывать, что вы их первый клиент 🙂

Ответ №1:

Я предлагаю создать AUTO_INCREMENT столбец и заполнить значение 10 цифрами. Вы могли бы сделать так, чтобы это был единственный столбец в таблице, как показано ниже, или, что более практично, ввести идентификатор таблицы invoice.

 CREATE TABLE tablename (
  id bigint unsigned not null auto_increment,
  primary key(id),
  auto_increment=1000000000
);
  

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

1. Мне нравится идея, но клиент все равно увидит 1000000001 и узнает, что это был первый счет 😉 Возможно, мне следует выбрать случайное число и перейти оттуда.

2. Достаточно справедливо. Вам пришлось бы предварительно заполнить эту таблицу и пометить строки как используемые затем. Но, очевидно, у этого решения есть ограничение.

3. Теперь я изменил значение auto_increment на sth crazy, надеясь, что никто никогда не заметит, что они являются первым клиентом 🙂 Спасибо за вашу помощь! 1

4. Джейсон, я думаю, Фрэнк имел в виду случайное начальное значение, используя ваше решение, а не случайное значение каждый раз.

5. Я понимаю. Тогда то, что сделал Фрэнк, должно быть в порядке вещей — запустить начальное значение со случайного 10-значного числа и автоматически увеличивать его оттуда. В таком случае, я считаю, что это подходящее решение, поскольку оно более надежное, чем предварительно заполненная таблица ключей.

Ответ №2:

На самом деле, причины не так очевидны, если только вы просто не хотите, чтобы ваши клиенты знали, что их так мало, что все они имеют однозначные идентификаторы 🙂

Кроме того, идентификатор клиента обычно генерируется при добавлении клиента, а не при выставлении счета. Если вы имели в виду номер счета, это другое, но рассуждения будут теми же.

Либо заполните таблицу фиктивной записью с подходящим более низким идентификатором (например, 314159), затем используйте что-то вроде:

 insert into test (number) select max(number) 1 from test
  

или используйте ключ автоматического увеличения с подходящим начальным значением (опять же, это значение зависит от вас, но вы должны выбрать что-то относительно «некруглое»).

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

Ответ №3:

 ALTER TABLE my_invoice_table auto_increment=1000000001
  

Увеличивать номера счетов-фактур можно — они должны быть уникальными, а не случайными.