#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
Увеличивать номера счетов-фактур можно — они должны быть уникальными, а не случайными.