Лучший способ для уникальной случайной строки для таблицы MySQL Long - PullRequest
3 голосов
/ 11 декабря 2010

Я знаю, как создавать случайные символы как в PHP, так и в MySQL, но вопрос в том, что мне нужно создать случайную строку из 4 символов для таблицы из 10 тысяч строк или около того.Каким способом лучше всего убедиться, что он останется уникальным?

Я могу использовать более длинную строку, если нужно, но не дольше, чем 12.

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

Ответы [ 6 ]

3 голосов
/ 11 декабря 2010

Опция:

Поместите все возможные символы в таблицу с одним столбцом.

val
------
0
1
...
9
a
b
...
z

Используйте этот запрос

SELECT CONCAT(a.val,b.val,c.val,d.val)
FROM chars AS a
JOIN chars AS b
JOIN chars AS c
JOIN chars AS d
ORDER BY RAND()
LIMIT 10000

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

A. Если у вас есть много неназначенных идентификаторов.

В этом случае вы просто генерируете ID и смотрите, является ли он бесплатным. Если нет, попробуйте другой.

B. Если вы хотите сохранить назначенные идентификаторы и доступные идентификаторы на одном уровне.

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

Если допустимые символы 0-9a-z, это означает, что таблица будет занимать 36 4 . Это всего лишь пара МБ.

2 голосов
/ 11 декабря 2010

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

Если вы выбираете, например, все символы и цифры, вам просто нужно создать подпрограмму, которая преобразует целое число в число «base 62».

0 голосов
/ 12 апреля 2013

Если у вас MySQL 5.6, вы можете использовать TO_BASE64 следующим образом:

select LEFT( TO_BASE64( SHA(rand()) ), 6 ) ;

В качестве альтернативы, если у вас нет 5.6,

DELIMITER //

drop function if exists randChr //
create function randChr()
returns char
BEGIN
  IF RAND() <= 0.5 THEN -- Lowercase
    return CHAR( 97 + 25*rand() ) ;
  ELSE -- uc
    return CHAR( 65 + 25*rand() ) ;
  END IF;
END //

drop function if exists randString //
create function randString( len int )
returns varchar(255)
BEGIN
  SET @n = 0;
  SET @res = '' ;
  REPEAT
    SET @res = concat( @res, randChr() ) ;
    set @n = @n + 1 ;
  UNTIL @n >= len END REPEAT;
  return @res ;
END //

DELIMITER ;

-- USE:
select randString( 5 );
select randString( 60 );
0 голосов
/ 11 декабря 2010

Похоже, у вас есть код в MySQL для создания этих строк со случайным значением.

Рассмотрите эту опцию:

  • create User DefinedФункция в MySQL .Пусть эта функция запустит операторы SQL для генерации и возврата этой новой случайной строки.Убедитесь, что вы используете NOT EXISTS(SELECT MyRandomString FROM MyTable) в этом операторе создания, чтобы проверить, что случайная строка не существует в таблице.

  • При вставке новых строк используйте возвращаемое значение этой функции, чтобы назначитьв столбец MyRandomString.

  • , чтобы обновить существующие данные, просто:

 UPDATE MyTable
 SET    MyRandomString = fn_CreateSomeRandomString()
  • при вставке:
 INSERT INTO MyTable (foo, bar, MyRandomString) 
 VALUES ('','', fn_CreateSomeRandomString());

Вот образец этого UDF в PasteBin .

0 голосов
/ 11 декабря 2010

Это может занять много времени, но позволит вам создать то, что вам нужно:

 CREATE FUNCTION gen_alphanum () RETURNS CHAR(4)
    RETURN 
    ELT(FLOOR(1 + (RAND() * (50-1))), 'a','b','c','d','e','f','g','h','i','j','k','l','m  ','n','o','p','q','r','s','t','u','v','w','x','y', 'z',
    'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y', 'Z',);
    )
0 голосов
/ 11 декабря 2010

Вы можете использовать ключевое слово DISTINCT.

Например, следующий запрос вернет только уникальные строки, по которым вы можете проверить, что ваша случайная строка из 4 символов остается уникальной:

mysql> SELECT DISTINCT random_strings FROM chars;
...