web-dev-qa-db-fra.com

Générer GUID dans MySQL pour des 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 de toutes les lignes existantes avec un nouveau et unique GUID aléatoire.

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 tous les champs le même

82
Tom

Je ne suis pas sûr que ce soit le moyen le plus simple, mais cela fonctionne. 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, enfin, de supprimer ce déclencheur:

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

Puis exécuter

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 (vous n'avez peut-être pas besoin de WHERE columnID is not null, donc tout mon code de fantaisie n'est pas nécessaire.

76
a1ex07

J'avais besoin d'ajouter une colonne de clé primaire guid dans une table existante et de la remplir avec un GUID unique. Cette requête de mise à jour avec sélection interne fonctionnait pour moi:

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

Si simple :-)

93
Rakesh Prajapati

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:

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)

19
Imran-UK
select @i:=uuid();
update some_table set guid = (@i:=uuid());
9
Brad Johnson

Juste un ajout mineur à faire car je me suis retrouvé avec un résultat étrange en essayant de modifier les UUID tels qu'ils ont été générés. J'ai trouvé le réponse by Rakesh comme étant le plus simple qui a bien fonctionné, sauf dans les cas où vous souhaitez effacer 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()), '-', ''));

Toutes les valeurs résultantes étaient alors identiques (pas légèrement différentes - j’ai vérifié quatre fois avec un GROUP BY some_field requete). Peu importe la façon dont j'ai situé les parenthèses, la même chose se produit.

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

Il semble que lorsqu’elle entoure la sous-requête pour générer un UUID avec REPLACE, elle n’exécute la requête qu’une seule fois, ce qui est probablement tout à fait logique en tant qu’optimisation pour des développeurs beaucoup plus intelligents que moi, mais ce n’était pas mon cas.

Pour résoudre ce problème, je viens de le scinder 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.

5
enobrev

On dirait une simple faute de frappe. Voulez-vous dire "... où columnId is null"?

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

J'ai principalement fait face au même problème. Mon cas est enregistré sous la forme BINARY (16) et n’a PAS de contraintes UNIQUES NOT NULL. Et j’ai fait face au problème lorsque le même UUID était généré pour chaque ligne et que la contrainte UNIQUE ne le permettait 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 sélection interne imbriquée:

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

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

2
Oleksandr Korniienko