génération de nombres uniques mysql
Je veux générer un unique entier aléatoire (de 10000 à 99999) l'identité simplement en propre mySQL; des idées?
Je ne veux pas générer ce nombre en php par vélo (générer un nombre -> cochez la case dans la base de données) parce que je veux utiliser certains solution intelligente dans une requête mySQL.
source d'informationauteur hippout
Vous devez vous connecter pour publier un commentaire.
Alors qu'il semble un peu maladroit, c'est ce qui peut être fait pour atteindre l'objectif:
Tout simplement, il génère des N nombres aléatoires, où N est le nombre de lignes de la table, filtre à ceux déjà présents dans la table, et les limites de la série.
Il pourrait être un peu lent sur de grandes tables. Pour accélérer les choses, vous pouvez créer une vue à partir de ces identifiants, et de l'utiliser à la place de imbriquée instruction select.
EDIT: supprimé les guillemets
Construire un tableau de nombres séquentiels à randomisés valeurs d'id dans la gamme de 1 à 1M:
(Tout cela prend environ 30 secondes pour s'exécuter sur mon ordinateur portable. Vous n'aurez qu'à le faire une seule fois pour chaque séquence.)
Maintenant, vous avez la cartographie, juste garder une trace de la façon dont beaucoup ont été utilisés (d'un comptoir ou d'auto_increment champ de clé dans une autre table).
J'ai du mal avec la solution ici, et alors réalisé qu'il échoue si la colonne a les entrées NULL. J'ai retravaillé ce avec le code suivant;
Violon ici;
http://sqlfiddle.com/#!2/620de1/1
Espère que son utile 🙂
Le seul à mi-chemin raisonnable idée que je peux venir avec est de créer une table avec une quantité déterminée de l'IDs et qu'elles sont utilisées de les supprimer de la table. Ces clés peuvent être uniques et un script pourrait être créé pour générer la table. Ensuite, vous pouvait tirer de l'une de ces touches en générant une sélection aléatoire à partir de la disposition des touches. J'ai dit à "mi-chemin" raisonnable et honnête qui a été de façon généreuse, mais il bat au hasard de générer des clés jusqu'à la création d'un genre unique, je suppose.
Ma solution, mise en œuvre dans Cakephp 2.4.7, est de créer un tableau avec une auto_incremental champ type
Ensuite, j'ai créé une fonction php de sorte que chaque fois insérer un nouvel enregistrement, lit l'identifiant généré et supprimez-le immédiatement.
Mysql permet de maintenir dans son mémoire de l'état du compteur. Tous les nombres générés sont uniques jusqu'à ce que vous réinitialisez le mot de compteur ou d'exécuter une instruction TRUNCATE TABLE d'opération
trouverez ci-dessous le Modèle créé dans Cakephp à mettre en œuvre tous les
Aucun contrôle sur la plage de l'appartenance de ce résultat peut être mis en œuvre dans la même fonction, en manipulant le résultat obtenu
La fonction RAND() génère un nombre aléatoire, mais pas garantir l'unicité. La bonne façon de gérer les identifiants uniques MySQL est à déclarer à l'aide de AUTO_INCREMENT.
Par exemple, le champ id dans le tableau suivant ne doivent pas être fournies sur les plaquettes, et il sera toujours incrément de 1:
J'ai essayé d'utiliser cette réponsemais il ne fonctionne pas pour moi, donc j'ai dû changer la requête d'origine un peu.
Créer un index unique sur le champ que vous voulez l'unique aléatoire #
Puis exécutez
Update IGNORE Table
Set RandomUniqueIntegerField=FLOOR(RAND() * 1000000);
Je m'inquiète pourquoi vous voulez faire cela, mais vous pouvez simplement utiliser:
Voir l'intégralité de l' MySQL RAND documentation pour plus d'informations.
Cependant, j'espère que vous n'êtes pas l'utilisation de ce comme un identificateur unique (l'utilisation d'un l'attribut auto_increment sur une assez grande nombre entier non signé de champ si c'est ce que vous êtes après) et je me demande pourquoi vous devriez utiliser MySQL pour cela, et pas un langage de script. Qu'essayez-vous de réaliser?