初衷:
我想在表格中生成随机且唯一的代码(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如何返回已经存在的值的行?
谢谢。