Получение уникального идентификатора без вставки - PullRequest
4 голосов
/ 21 декабря 2011

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

Я просто хочу выполнить какой-то оператор SELECT ..., чтобы он всегда возвращал уникальный номер без вставки в базу данных.Просто то, что увеличивает некоторое сохраненное значение и возвращает значение и может обрабатывать множество запросов одновременно, без сильной блокировки приложения.

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

Такое ощущение, что должен быть какой-то простой способ получить это.

Чтобы уточнить ...

Мне нужно, чтобы этот номер был коротким, так как он будет частью URL-адреса, и запрос может блокировать строку на короткий промежуток времени.То, что я искал, может быть, какая-то команда, которая подкапотным делом делает что-то вроде этого ...

LOCK VALUE
RETURN VALUE++
UNLOCK VALUE

Где VALUE хранится в базе данных, может быть база данных MySQL.

Ответы [ 4 ]

3 голосов
/ 21 декабря 2011

Вы ищете UUID().

http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

mysql> SELECT UUID();
    -> '6ccd780c-baba-1026-9564-0040f4311e29'

Возвращает 128-битное шестнадцатеричное число. Вы можете мундж при необходимости.

1 голос
/ 21 декабря 2011

Отличный вопрос.

Кратчайший ответ - это просто невозможно в соответствии с вашими требованиями.

Длинный ответ - самый близкий подход к этому - MySQL's UUID, но это не является ни коротким, ни сортируемым (то есть: прежнее значение UUID должно быть больше / меньше, чем предыдущее).

Для UUID или не для UUID? - это хорошая статья, в которой описаны плюсы и минусы их использования, а также некоторые причины, почему вы не можете получить то, что вам нужно

1 голос
/ 21 декабря 2011

Является ли уникальный номер, который будет связан с определенной строкой в ​​таблице? Если нет, то почему бы не вызвать rand (): select rand(); Возвращаемое значение находится в диапазоне от нуля до единицы, поэтому масштабируйте по желанию.

1 голос
/ 21 декабря 2011

Я не уверен, что точно понимаю, может быть, что-то вроде этого:

SELECT ROUND(RAND() * 123456789) as id

Чем больше вы делаете число, тем больше ваш идентификатор.

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

Конечно, есть много других подходов, чтобы сделать это.

Вы можете легко использовать практически любой язык сценариев, чтобы сгенерировать это для вас, пример PHP здесь:

//Generates a 32 character identifier that is extremely difficult to predict.
$id = md5(uniqid(rand(), true)); 

//Generates a 32 character identifier that is extremely difficult to predict.
$id = md5(uniqid(rand(), true)); 

Затем используйте $id в своем запросе или в любом другом месте, где вам нужен ваш уникальный идентификатор. На мой взгляд, преимущество выполнения этого на языке сценариев при взаимодействии с БД заключается в том, что его легче проверять в целях применения / использования. и действовать соответственно. Например, в вашем примере, каким бы методом вы ни пользовались, если вы хотите быть на 100% всегда уверены в целостности данных, вы должны убедиться, что в другом месте нет дубликатов этого идентификатора. Это легче сделать в скрипте, чем в SQL.

Надеюсь, это поможет моему другу, удачи!

...