Я пытаюсь написать хранимую функцию для MySQL для генерации случайного и уникального PIN-кода, который затем будет вставлен в поле «PIN-код» в таблице базы данных. Это должно быть сделано БД, поскольку различные системы могут запрашивать базу данных и вызывать эту функцию.
Случайное число - легкий бит; я пытаюсь проверить, что созданный PIN-код еще не использовался, и, если это так, генерировать новые PIN-коды, пока мы не получим новый. Чтобы добиться этого, я пытаюсь использовать цикл WHILE, но кажется, что он застревает, вращаясь, потому что когда я запускаю функцию, MySQL просто останавливается и процессор запускается, пока я не остановлю / не перезапущу службу.
Это моя функция на данный момент:
DELIMITER @@
CREATE FUNCTION generate_unique_pin() RETURNS int(11)
BEGIN
DECLARE pin INT;
DECLARE myloop BOOL;
SET myloop = 1;
WHILE myloop = 1 DO
SET pin = FLOOR( RAND( ) * 99999999 );
IF (SELECT COUNT(*) AS used FROM mydb.mytable WHERE PIN = pin) = 0 THEN
SET myloop = 0;
END IF;
END WHILE;
RETURN pin;
END@@
DELIMITER ;
Я тоже пробовал что-то вроде
SET used = (SELECT COUNT(*) AS used FROM mydb.mytable WHERE PIN = pin)
IF used = 0 THEN (etc...)
Но у меня все та же проблема. Код случайного числа работает, потому что если я удаляю цикл, функция работает нормально (просто не гарантирует уникальность), и запрос также работает нормально, если я запускаю его сам, возвращая набор записей с «used» и 0 или 1.
Любая помощь или совет, полученный с благодарностью!