Générer un GUID dans MySQL pour les données existantes?

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 des GUID aléatoires nouveaux et uniques.

Comment est-ce que je fais ceci dans MySQL?

j’ai essayé

UPDATE db.tablename SET columnID = UUID() where columnID is not null 

Et juste obtenir chaque champ le même

Je ne sais pas si c’est le moyen le plus facile, mais ça marche. L’idée est de créer un déclencheur qui fonctionne tout pour vous, puis d’exécuter une requête qui met à jour votre table et de supprimer ce déclencheur:

 delimiter // create sortinggger beforeYourTableUpdate BEFORE UPDATE on YourTable FOR EACH ROW BEGIN SET new.guid_column := (SELECT UUID()); END // 

Ensuite, exécutez

 UPDATE YourTable set guid_column = (SELECT UUID()); 

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:

 UPDATE YourTable, INNER JOIN (SELECT unique_col, UUID() as new_id FROM YourTable) new_data ON (new_data.unique_col = YourTable.unique_col) SET guid_column = new_data.new_id 

UPDATE encore une fois: Il semble que votre requête d’origine devrait également fonctionner (peut-être que vous n’avez pas besoin de WHERE columnID is not null , donc tout mon code de fantaisie n’est pas nécessaire.

J’avais besoin d’append 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 select interne a fonctionné pour moi:

 UPDATE sri_issued_quiz SET quiz_id=(SELECT uuid()); 

Si simple 🙂

La solution approuvée crée des identifiants uniques, mais à première vue, ils sont identiques, seuls les premiers caractères diffèrent.

Si vous voulez des clés visiblement différentes, essayez ceci:

 update CityPopCountry set id = (select md5(UUID())); MySQL [imran@lenovo] {world}> select city, id from CityPopCountry limit 10; +------------------------+----------------------------------+ | city | id | +------------------------+----------------------------------+ | A Coruña (La Coruña) | c9f294a986a1a14f0fe68467769feec7 | | Aachen | d6172223a472bdc5f25871427ba64e46 | | Aalborg | 8d11bc300f203eb9cb7da7cb9204aa8f | | Aba | 98aeeec8aa81a4064113764864114a99 | | Abadan | 7aafe6bfe44b338f99021cbd24096302 | | Abaetetuba | 9dd331c21b983c3a68d00ef6e5852bb5 | | Abakan | e2206290ce91574bc26d0443ef50fc05 | | Abbotsford | 50ca17be25d1d5c2ac6760e179b7fd15 | | Abeokuta | ab026fa6238e2ab7ee0d76a1351f116f | | Aberdeen | d85eef763393862e5fe318ca652eb16d | +------------------------+----------------------------------+ 

J’utilise la version du serveur MySQL: 5.5.40-0 + wheezy1 (Debian)

 select @i:=uuid(); update some_table set guid = (@i:=uuid()); 

Ressemble à une simple faute de frappe. Vous ne vouliez pas dire “… où columnId est nul”?

 UPDATE db.tablename SET columnID = UUID() where columnID is null 

Juste un ajout mineur à faire car j’ai fini avec un résultat étrange en essayant de modifier les UUID comme ils ont été générés. J’ai trouvé la réponse de Rakesh la plus simple qui fonctionnait bien, sauf dans les cas où vous souhaitez supprimer les tirets.

Pour référence:

 UPDATE some_table SET some_field=(SELECT uuid()); 

Cela a parfaitement fonctionné seul. Mais quand j’ai essayé ceci:

 UPDATE some_table SET some_field=(REPLACE((SELECT uuid()), '-', '')); 

Ensuite, toutes les valeurs résultantes étaient les mêmes (pas subtilement différentes – j’ai quadruplé avec une requête GROUP BY some_field ). Peu importe comment je situe les parenthèses, la même chose se produit.

 UPDATE some_table SET some_field=(REPLACE(SELECT uuid(), '-', '')); 

Il semble qu’en entourant la sous-requête de générer un UUID avec REPLACE, elle n’exécute la requête UUID qu’une seule fois, ce qui est probablement une optimisation pour des développeurs beaucoup plus intelligents que moi, mais cela ne m’a pas été fait.

Pour résoudre ce problème, je viens de le diviser en deux requêtes:

 UPDATE some_table SET some_field=(SELECT uuid()); UPDATE some_table SET some_field=REPLACE(some_field, '-', ''); 

Solution simple, évidemment, mais j’espère que cela sauvera à quelqu’un le temps que je viens de perdre.

J’ai surtout eu le même problème. Dans mon cas, uuid est stocké en tant que BINARY (16) et n’a PAS de contraintes UNIQUE NULL. Et j’ai rencontré le problème quand le même UUID a été généré pour chaque ligne et que 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 nestede:

UNHEX(REPLACE((SELECT uuid()), '-', ''))

Ensuite, est produit un résultat unique pour chaque entrée.