最初目标:
我想在表格中生成随机和唯一代码(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如何返回包含已存在值的行?
由于
答案 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)
(据我所知,这种生成方式是一种概念证明)
非常奇怪的是这个请求如何返回已经存在的值????