MySQL вставить уникальную технику - PullRequest
4 голосов
/ 19 февраля 2012

У меня есть приложение php, которое вставляет данные в MySQL, который содержит случайно сгенерированное уникальное значение.Строка будет иметь около 1 миллиарда возможностей, возможно, не более 1 или 2 миллионов записей одновременно.По сути, большинство комбинаций не будет существовать в базе данных.

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

  1. Есть функция, которая генерирует этот уникальный идентификатор.В каждом поколении проверяйте, существует ли значение в базе данных, если да, затем повторно генерируйте, если нет, возвращаемое значение.
  2. Создание случайной строки и попытка вставки.Если вставка завершится неудачно, ошибка теста будет 1062 (повторяющаяся запись MySQL X для ключа Y ), заново сгенерируйте ключ и вставьте с новым значением.плохая идея полагаться на ошибку MySQL для повторной попытки вставки?Насколько я понимаю, значение, вероятно, будет уникальным, и кажется, что начальное (с использованием техники 1) было бы ненужным.Также упоминается, что значение должно быть длиной 6 символов, состоящей из заглавных букв и / или цифр.Они также не могут быть инкрементными - они должны быть случайными.

    РЕДАКТИРОВАТЬ # 2

    Как примечание, я пытаюсь создать код погашения дляподарочный сертификат, который сложно угадать.Использование цифр и букв создает 36 возможностей для каждого символа вместо 10 для просто цифр или 26 для просто букв.

    Вот урезанная версия решения, которое я создал.Первое значение, введенное в таблицу, является первичным ключом, который автоматически увеличивается.disabled_rows () будет равно 1, если вставка прошла успешно:

     $code = $build_code();
     while ((INSERT INTO certificates VALUES ('', $code) ON DUPLICATE KEY UPDATE pk = pk) && affected_rows() == 0)
          $code = $build_code();
    

Ответы [ 3 ]

2 голосов
/ 19 февраля 2012

Это плохая идея полагаться на ошибку MySQL для повторной попытки вставки?

Нет. Идите вперед, используйте его, если хотите. На самом деле, многие люди думают, что если вы проверите, и если он не существует, его безопасно вставить. Но если вы не заблокируете таблицу, всегда возможно, что другой процесс может сработать и получить идентификатор.

Итак, генерируйте случайный идентификатор, если он соответствует вашим целям. Просто убедитесь, что вы тестируете свой код, чтобы он правильно обрабатывал ошибки. Также может быть полезно регистрировать дуплики только для того, чтобы убедиться, что ваши предположения о том, как происходят несвязанные дуплицы, верны.

0 голосов
/ 19 февраля 2012

Определите вашу таблицу с уникальным ограничением:

http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html

0 голосов
/ 19 февраля 2012

Почему бы просто не использовать: "YourColName BIGINT AUTO_INCREMENT PRIMARY KEY" для обеспечения уникальности?

...