MySQL Long Table的唯一随机字符串的最佳方法

时间:2010-12-11 15:21:22

标签: mysql database random relational-database

我知道如何在PHP和MySQL上创建随机字符,但问题是我必须为一万个左右的行创建一个4字符随机字符串。最好的方法是确保它保持独特?

如果我需要但不长于12,我可以使用更长的字符串。

为了简单起见,表格存在我需要添加一个额外的列并用4个字符随机字符串填充它,键必须保持唯一。

6 个答案:

答案 0 :(得分:3)

选项:

将所有可能的字符放在只有一列的表中。

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

另一方面,如果你需要一次获得一个ID,我会看到两种方法。

一种。如果您有许多未分配的ID。

在这种情况下,您只需生成一个ID,看看它是否免费。如果没有尝试另一个。

B中。如果您希望为您分配ID和相同幅度级别​​的可用ID。

在这种情况下,最好预先生成所有ID,随机播放,当您需要时,只需选择下一个可用ID。假设将它们全部放在一个表中,当您从该表中分配一个时,将其删除,以便不能再次拾取它。

如果您允许的字符为0-9a-z,则表示该表将占用36 4 。那只是几MB。

答案 1 :(得分:2)

由于这些字符串必须是唯一的,为什么不使用数字自动增量值,然后将其转换为基于字符的值,类似于十进制到十六进制的转换。

如果您选择例如您只需创建一个将整数转换为“基数为62”的例程的所有字符和数字。

答案 2 :(得分:0)

您可以使用DISTINCT关键字。

例如,以下查询将仅返回唯一行,您可以通过该行验证您的4个字符随机字符串是否仍为唯一:

mysql> SELECT DISTINCT random_strings FROM chars;

答案 3 :(得分:0)

这可能很冗长,但可以让你创造出你需要的东西:

 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',);
    )

答案 4 :(得分:0)

听起来你已经在MySQL中获得了用于创建这些随机值字符串的代码。

考虑这个选项:

  • 创建User Defined Function in MySQL。让此函数运行SQL语句以生成并返回此新的随机字符串。确保在该创建语句中使用NOT EXISTS(SELECT MyRandomString FROM MyTable)来检查表中是否已存在随机字符串。

  • 插入新行时,请使用此函数的返回值分配到MyRandomString列。

  • 更新现有数据,只需:

 UPDATE MyTable
 SET    MyRandomString = fn_CreateSomeRandomString()
  • 插入时:
 INSERT INTO MyTable (foo, bar, MyRandomString) 
 VALUES ('','', fn_CreateSomeRandomString());

这是sample of that UDF on PasteBin

答案 5 :(得分:0)

如果你有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 );