使用MySQL生成唯一且随机的代码数字

时间:2012-03-09 09:40:24

标签: mysql random unique

最初目标:

我想在表格中生成随机和唯一代码(6位数)。 我使用像这样的SQL查询来做到这一点:

SELECT SUBSTRING(CRC32(RAND()), 1, 6) as myCode
FROM `codes`
HAVING myCode NOT IN (SELECT code FROM `codes`)

我问我在没有更多可用代码时会如何反应,所以我做了以下测试


测试环境:

MySQL版本:5.5.20

MySQL表:

CREATE TABLE `codes` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`code` VARCHAR( 10 ) NOT NULL ,
UNIQUE (
`code`
)
) ENGINE = InnoDB;

初始数据:

INSERT INTO `codes` (`id`, `code`)
VALUES (NULL, '1'), (NULL, '2'), (NULL, '3'), (NULL, '4'), (NULL, '5'), (NULL, '6'), (NULL, '7'), (NULL, '8');

SQL查询:

SELECT SUBSTRING(CRC32(RAND()), 1, 1) as myCode
FROM `codes`
HAVING myCode NOT IN (SELECT code FROM `codes`)

通过执行此查询,我希望它始终返回9,因为它是一个不存在的唯一代码。

但结果是:

  • 有时会返回任何行
  • 有时会返回包含已存在值的行

我不明白这种行为,所以如果有人可以提供帮助:)

所以最大的问题是:

  

MySQL如何返回包含已存在值的行?

由于

2 个答案:

答案 0 :(得分:2)

我会按顺序在sequencetable表中填入所有可能的值。

然后随机查询只是随机选择sequencetable中的记录,每次选择记录时都会删除它。这样你就可以获得所有数字,而不会浪费时间找到一个“洞”号码(尚未拾取)。

CREATE TABLE `sequencetable` 
(
    `sequence` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`sequence`)
)
ENGINE=InnoDB
AUTO_INCREMENT=1;

填写序列(实际上不需要AUTOINCREMENT)。

DECLARE i INT;

SET i=1;
REPEAT
    INSERT INTO sequencetable VALUES (i);
    SET i=i+1;
UNTIL i>999999 END REPEAT;

从序列中选择一个随机记录(在循环中执行此操作直到记录可用):

DECLARE sequencen INT;

SET sequencen = 
    (SELECT sequence FROM sequencetable ORDER BY RAND() LIMIT  1);

DELETE FROM sequencetable WHERE sequence = sequencen;

答案 1 :(得分:0)

(据我所知,这种生成方式是一种概念证明)

非常奇怪的是这个请求如何返回已经存在的值????