Непредсказуемое случайное число, уникальное в таблице в MariaDB (не только инкрементное) - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть таблица Users в MariaDB, и мне нужно сгенерировать serviceNumber для каждого вновь созданного пользователя.

Пример этого кода: 865165

Только два требования :

  • Уникально в User таблице
  • Непредсказуемо при создании пользователя (возможно, не на основе AutoIncrement?)

Возможно ли это только с базой данных? Или мне нужно реализовать это в бэкэнде при создании пользователя.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2020

Единственное (теоретически) решение без коллизий - генерировать serviceNumber с функцией UUID() (или, может быть, UUID_SHORT()).

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

1 голос
/ 21 февраля 2020

Шаги 1-3 являются шагами настройки:

  1. Определите, насколько большими должны быть цифры. Числа 6-ди git позволят получить миллион номеров.
  2. Построить временную таблицу t со всеми 6-ди git числами (t_num).
  3. Создайте и заполните постоянную таблицу:

    CREATE TABLE `u` (
        id INT AUTO_INCREMENT NOT NULL,
        t_num INT NOT NULL,
        PRIMARY KEY(id)
    );
    INSERT INTO u (t_num)
        SELECT t_num FROM t ORDER BY RAND();
    

4 - План A У вас есть идентификатор auto_in c в реальной таблице; просто присоединитесь к u, чтобы получить случайное число 6-ди git.

4 - План B

    BEGIN;
    SELECT t_num FROM u ORDER BY id LIMIT 1 FOR UPDATE;  -- to get the random id
    DELETE FROM u ORDER BY id LIMIT 1;   -- Remove it from the list of available ids
0 голосов
/ 20 февраля 2020

Из MySQL справочное руководство:

Чтобы получить случайное целое число R в диапазоне i <= R <j, используйте выражение FLOOR (i + RAND () * (j - i) )). Например, чтобы получить случайное целое число в диапазоне 7 <= R <12, используйте следующую инструкцию: <br>SELECT FLOOR(7 + (RAND() * 5));

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

...