2012-01-26 4 views
1

Est-il possible d'insérer un nombre pseudo-aléatoire unique à côté de chaque enregistrement existant dans une table?Insérer PRNG unique dans la colonne Db

Quelque chose comme:

UPDATE Products P1 
SET RandomId = Random() 
WHERE NOT EXISTS (
    SELECT Id 
    FROM Products P2 
    WHERE RandomId = [The same random as above] 
) 

(Oui, je suis conscient du fait que les conflits ne allait tout simplement, ne pas les résoudre)

Je suis conscient que je pouvais faire ce itérativement par code ou même en multi -line statement - mais y a-t-il une seule commande qui ferait ça pour moi? NB: Cette question est pour ma propre édition afin que les réponses Microsoft SQL Server et MySQL soient toutes deux appréciées. Merci.

+0

flottant au hasard? Entier aléatoire? Entre quelles valeurs? –

+0

Nombre entier aléatoire - Pas de limite supérieure réelle en dessous de la taille maximale, mais s'il est possible de mettre une limite de, disons 1e9, ce serait pratique. – Basic

+0

Pour clarifier, 1e9 = 1x10^9 – Basic

Répondre

0

N'utilisez jamais de manière aléatoire pour ce type d'opération. Vous devez utiliser un numéro de séquence. Si vous utilisez au hasard, vous vous attendez au hasard comme la loterie :)

Si vous souhaitez utiliser aléatoire unique, vous devez faire quelque chose comme:

select @max := max(RandomId) from Products; 
update Products set RandomId = @max := @max + Rand() + 1; 
  • 1 est là pour faire en sorte que Rand ne retourner zéro.

Ou vous pouvez créer une boucle qui pourrait ne pas terminer en 3 fois l'âge de l'univers :)

+0

Merci d'avoir répondu mais pourquoi voudrais-je une séquence dans ce cas (fictif)? Cela mis à part, votre solution a un léger problème qui est qu'elle va manger l'espace adressable - peut-être très rapidement - et ne jamais combler les lacunes. Sauf si j'ai mal compris? – Basic

+0

Je devrais aussi avoir mentionné que ce sont des instructions multiples et si je voulais faire cela, je voudrais juste générer un aléatoire, vérifier qu'il n'existe pas alors l'utiliser - Ce que je veux savoir est s'il est possible de mettre à jour (ou Insérer) un Rnd unique en une opération. – Basic

+0

Vous voulez faire trop de choses en une seule requête: 1. vous voulez remplir les espaces. 2. vous souhaitez utiliser une requête. 3. vous voulez vérifier les doublons. 4. vous ne voulez pas utiliser de séquence. la réponse est non spécifiquement pour (3). – vimdude

0

essayer

SELECT NEWID() 

charge dans une variable puisque vous devez utiliser la même valeur plus d'une fois.

+0

Pour clarifier, la question a été soulevée car quelqu'un que je connais envisage de le faire pour résumer le numéro de pièce de plusieurs fabricants. Pour cette raison, les numéros seront utilisés (dans son cas) par téléphone. Il y a une centaine de solutions qui fonctionneront mais je voulais développer mes connaissances en SQL. – Basic