Je viens d'importer un tas de données dans une table MySQL et j'ai une colonne "GUID" que je veux essentiellement remplir toutes les lignes existantes avec de nouveaux GUID aléatoires uniques.
Comment faire cela dans MySQL?
j'ai essayé
UPDATE db.tablename
SET columnID = UUID()
where columnID is not null
Et que chaque champ soit le même
Réponses:
Je ne sais pas si c'est le moyen le plus simple, mais cela fonctionne. L'idée est de créer un déclencheur qui fait tout son travail pour vous, puis d'exécuter une requête qui met à jour votre table, et enfin de supprimer ce déclencheur:
Puis exécutez
Et
DROP TRIGGER beforeYourTableUpdate
;UPDATE Une autre solution qui n'utilise pas de déclencheurs, mais nécessite une clé primaire ou un index unique:
MISE À JOUR une fois de plus: Il semble que votre requête d'origine devrait également fonctionner (peut-être que vous n'en avez pas besoin
WHERE columnID is not null
, donc tout mon code sophistiqué n'est pas nécessaire.la source
UUID
est mis en œuvre correctement (et je pense que c'est le cas), vous devriez être en mesure de créer un index unique sans vérifier les doublons.J'avais besoin d'ajouter une colonne de clé primaire guid dans une table existante et de la remplir avec des GUID uniques et cette requête de mise à jour avec sélection interne a fonctionné pour moi:
Si simple :-)
la source
UUID
est généré en fonction de la machine et de l'horodatage . En tant que requête qui prend des millisecondes pour s'exécuter, elles doivent être très très proches en effet ... mais jamais les mêmes ... une bonne chose à vous assurer, c'est d'ajouter unUNIQUE
index à cette colonne.UPDATE sri_issued_quiz SET quiz_id=uuid();
La solution approuvée crée des identifiants uniques, mais à première vue, ils semblent identiques, seuls les premiers caractères diffèrent.
Si vous voulez des clés visiblement différentes, essayez ceci:
J'utilise la version MySQL Server: 5.5.40-0 + wheezy1 (Debian)
la source
SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')
requête n'est pas très jolie mais elle fait le travail.la source
Juste un ajout mineur à faire car je me suis retrouvé avec un résultat étrange en essayant de modifier les UUID au fur et à mesure qu'ils étaient générés. J'ai trouvé la réponse par Rakesh était la plus simple qui fonctionnait bien, sauf dans les cas où vous souhaitez supprimer les tirets.
Pour référence:
Cela fonctionnait parfaitement tout seul. Mais quand j'ai essayé ceci:
Ensuite, toutes les valeurs résultantes étaient les mêmes (pas subtilement différentes - j'ai quadruple vérifié avec une
GROUP BY some_field
requête). Peu importe comment j'ai placé les parenthèses, la même chose se produit.Il semble qu'en entourant la sous-requête pour générer un UUID avec REPLACE, il n'exécute la requête UUID qu'une seule fois, ce qui est probablement parfaitement logique en tant qu'optimisation pour des développeurs beaucoup plus intelligents que moi, mais ce n'est pas le cas pour moi.
Pour résoudre ce problème, je viens de le diviser en deux requêtes:
Solution simple, évidemment, mais j'espère que cela fera gagner à quelqu'un le temps que je viens de perdre.
la source
On dirait une simple faute de frappe. Vous ne vouliez pas dire "... où columnId est nul"?
la source
WHERE
clause. Et les valeurs générées sont très similaires, il faut donc les regarder de près pour voir qu'elles sont effectivement différentes.J'ai été confronté au même problème. Im mon cas uuid est stocké comme BINARY (16) et a des contraintes NOT NULL UNIQUE. Et j'ai été confronté au problème lorsque le même UUID était généré pour chaque ligne, et la contrainte UNIQUE ne le permet pas. Donc, cette requête ne fonctionne pas:
UNHEX(REPLACE(uuid(), '-', ''))
Mais pour moi, cela a fonctionné, lorsque j'ai utilisé une telle requête avec une sélection interne imbriquée:
UNHEX(REPLACE((SELECT uuid()), '-', ''))
Puis est produit un résultat unique pour chaque entrée.
la source
la source
MYsql UPDATE nomtable SET columnName = UUID ()
oracle UPDATE nomtable SET columnName = SYS_GUID ();
SQLSERVER UPDATE nomtable SET columnName = NEWID () ;;
la source
la source