Будут ли все числа на 100% уникальными в таблице, если использовать этот простой алгоритм? - PullRequest
0 голосов
/ 11 ноября 2011

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

Итак, серверная часть по событию пользователя делает это (используя php):

  • Находит максимальное значение из столбца в БД,
  • Добавляет 10 к максимальному значению,
  • это новое и уникальное (больше максимального) значение, которое мы вставляем в таблицу.

Будут ли все числа уникальными и будут выглядеть как 1, 11, 21, 31, если они начинаются с 1? Мне любопытно, если вставка в таблицу завершится до того, как она начнет выполнять очередную очередь, и число будет как 1, 11, 21, 21, 31, 41?

Если теоретически это работает так (упорядочено по времени)

  1. найти максимальное значение из столбца для первого пользователя
  2. найти максимальное значение из столбца для второго пользователя (оно будет таким же)
  3. вставить (максимум + 10) для первого пользователя в ту же таблицу
  4. вставить (максимум + 10) для второго пользователя в ту же таблицу (она будет одинаковой), тогда результаты будут одинаковыми, и 1 значение можно будет повторить дважды или даже больше ...

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

Добавлено: Можно ли быть уверенным с этим алгоритмом и без использования автоинкрементов? Автоинкремент используется для другого столбца. Отверстия между номерами в порядке. Единственное требование состоит в том, что числа должны быть разными, но с некоторой «дельтой», которая больше одного. Извините, я не заметил об этом в своем вопросе. Спасибо.

Ответы [ 4 ]

2 голосов
/ 11 ноября 2011

Если у вас нет особых причин против этого, я рекомендую использовать AUTO_INCREMENT - он будет масштабироваться намного лучше и фактически оставит меньше «дырок» в последовательности чисел, чем ваш подход.

И вы правы - ваш подход на самом деле не гарантирует уникальности в параллельной среде.Один из способов заставить ваш алгоритм работать, это иметь УНИКАЛЬНОЕ ограничение для вашего поля (если оно еще не является ПЕРВИЧНЫМ КЛЮЧОМ), а затем многократно пытаться вставить новое значение - если это не удастся, просто сгенерируйте новое значение и попробуйте снова, и в конечном итоге это произойдетуспех.

1 голос
/ 11 ноября 2011

Звучит так, как будто вы хотите использовать автоинкремент .

1 голос
/ 11 ноября 2011

Использовать столбец с автоинкрементом в db

0 голосов
/ 11 ноября 2011

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

insert into mytable (
  column1,
  column2,
  fake_auto_incr
) select
    'value for column1',
    'value for column2',
    max (fake_auto_incr) + 1
  from mytable

Поскольку insert является оператором транзакции, базы данных ACID гарантируют, что уловка max+1 всегда будет на единицу больше, чем текущее верхнее значение.

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

insert into mytable (
  column1,
  column2,
  fake_auto_incr
) select
    'value for column1',
    'value for column2',
    coalesce (max (fake_auto_incr), 0) + 1
  from mytable

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...