Acabo de importar un montón de datos a una tabla MySQL y tengo una columna "GUID" que básicamente quiero llenar todas las filas existentes con GUID aleatorios nuevos y únicos.
¿Cómo hago esto en MySQL?
Lo intenté
UPDATE db.tablename
SET columnID = UUID()
where columnID is not null
Y haz que todos los campos sean iguales
Respuestas:
No estoy seguro de si es la forma más fácil, pero funciona. La idea es crear un disparador que haga todo el trabajo por usted, luego, ejecutar una consulta que actualice su tabla y, finalmente, soltar este disparador:
Entonces ejecuta
Y
DROP TRIGGER beforeYourTableUpdate
;ACTUALIZAR Otra solución que no usa activadores, pero requiere una clave principal o un índice único:
ACTUALIZAR una vez más: Parece que su consulta original también debería funcionar (tal vez no lo necesite
WHERE columnID is not null
, por lo que no se necesita todo mi código elegante.fuente
UUID
se implementa correctamente (y creo que lo es), debería poder crear un índice único sin verificar si hay duplicados.Tuve la necesidad de agregar una columna de clave primaria guid en una tabla existente y completarla con GUID únicos y esta consulta de actualización con selección interna funcionó para mí:
Tan sencillo :-)
fuente
UUID
se genera en función de la máquina y la marca de tiempo . Como una consulta que tarda milisegundos en ejecutarse, tienen que estar muy, muy cerca de hecho ... pero nunca iguales ... una buena cosa para asegurarles es agregar unUNIQUE
índice a esa columna.UPDATE sri_issued_quiz SET quiz_id=uuid();
La solución aprobada crea identificaciones únicas, pero a primera vista parecen idénticas, solo difieren los primeros caracteres.
Si desea claves visiblemente diferentes, intente esto:
Estoy usando la versión del servidor MySQL: 5.5.40-0 + wheezy1 (Debian)
fuente
SELECT INSERT(INSERT(INSERT(INSERT(MD5(UUID()), 9, 0, '-'), 14, 0, '-'), 19, 0, '-'), 24, 0, '-')
consulta no es muy bonita pero hace el trabajo.fuente
Solo una pequeña adición para hacer, ya que terminé con un resultado extraño al intentar modificar los UUID a medida que se generaban. Encontré que la respuesta de Rakesh es la más simple que funcionó bien, excepto en los casos en los que desea eliminar los guiones.
Para referencia:
Esto funcionó perfectamente por sí solo. Pero cuando probé esto:
Entonces, todos los valores resultantes fueron los mismos (no sutilmente diferentes, lo cuadriplicaron con una
GROUP BY some_field
consulta). No importa cómo ubique los paréntesis, sucede lo mismo.Parece que al rodear la subconsulta para generar un UUID con REPLACE, solo ejecuta la consulta UUID una vez, lo que probablemente tiene mucho sentido como optimización para desarrolladores mucho más inteligentes que yo, pero no para mí.
Para resolver esto, lo dividí en dos consultas:
Solución simple, obviamente, pero espero que esto le ahorre a alguien el tiempo que acabo de perder.
fuente
Parece un simple error tipográfico. ¿No quiso decir "... donde columnId es nulo"?
fuente
WHERE
cláusula. Y los valores generados son muy similares, por lo que hay que mirarlos de cerca para ver que efectivamente son diferentes.Enfrenté principalmente el mismo problema. En mi caso, el uuid se almacena como BINARIO (16) y NO tiene restricciones NULL ÚNICAS. Y me enfrenté al problema cuando se generó el mismo UUID para cada fila, y la restricción ÚNICA no lo permite. Entonces esta consulta no funciona:
UNHEX(REPLACE(uuid(), '-', ''))
Pero para mí funcionó, cuando usé una consulta de este tipo con selección interna anidada:
UNHEX(REPLACE((SELECT uuid()), '-', ''))
Entonces se produce un resultado único para cada entrada.
fuente
fuente
MYsql UPDATE nombre de tabla SET columnName = UUID ()
oracle UPDATE tablename SET columnName = SYS_GUID ();
SQLSERVER UPDATE nombre de tabla SET columnName = NEWID () ;;
fuente
fuente