Bien que cela semble quelque peu gênant, voici ce qui peut être fait pour atteindre l'objectif :
SELECT FLOOR(10000 + RAND() * 89999) AS random_number
FROM table
WHERE random_number NOT IN (SELECT unique_id FROM table)
LIMIT 1
En termes simples, il génère N nombres aléatoires, où N est le nombre de lignes du tableau, filtre ceux déjà présents dans le tableau et limite l'ensemble restant à un.
Cela pourrait être un peu lent sur les grandes tables. Pour accélérer les choses, vous pouvez créer une vue à partir de ces identifiants uniques et l'utiliser à la place de l'instruction de sélection imbriquée.
EDIT :guillemets supprimés