Начальная цель:
Я хотел бы генерировать случайные и уникальные коды (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 может возвращать строки с уже существующими значениями?
Спасибо