Генерация случайного и уникального PIN-кода с использованием хранимой функции MySQL с циклом WHILE - PullRequest
0 голосов
/ 08 марта 2012

Я пытаюсь написать хранимую функцию для 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.

Любая помощь или совет, полученный с благодарностью!

1 Ответ

1 голос
/ 08 марта 2012

У вас есть PIN и pin, столбец и переменная с почти одинаковыми именами, различающиеся только по регистру.

Сделай их разными.

...