2010-10-30 18 views

Respuesta

9

Siendo que UUID() no se acepta como una restricción POR DEFECTO, debe utilizar un desencadenador.

Ésta establece el valor de la columna NEW_TABLE.uuid:

delimiter $$ 

CREATE 
DEFINER=`root`@`localhost` 
TRIGGER `example`.`newid` 
BEFORE INSERT ON `example`.`new_table` 
FOR EACH ROW 
BEGIN 
    SET NEW.`uuid` = UUID(); 
END 
$$ 
+1

a trigger? hombre que es feo :) ¡gracias! – Blankman

+0

+1 - Has respondido a mi pregunta, que era completamente diferente a la original, ¡pero te agradezco de todos modos! – Fenton

8

Previous answer no es del todo bien - tienes que tener cuidado con los desencadenantes ... que en realidad se sobreponen a cualquier valor por defecto se pasa en si usado como en ese ejemplo. Todo funcionará bien cuando la clave principal no esté configurada, pero si pasa una con el INSERT, se borrará con una nueva al azar mediante el disparador.

Para que funcione correctamente, debe comprobar si el campo ya tiene un valor antes de asignar una nueva, de la siguiente manera:

DELIMITER ;; 
CREATE TRIGGER `sometrigger` 
BEFORE INSERT ON `sometable` 
FOR EACH ROW 
BEGIN 
    IF ASCII(NEW.uuid) = 0 THEN 
     SET NEW.uuid = UNHEX(REPLACE(UUID(),'-','')); 
    END IF; 
    SET @last_uuid = NEW.uuid; 
END 
;; 

utilizo ASCII() para comprobar el nuevo valor del campo, como ASCII() devolverá 0 para una cadena vacía si los datos están en formato textual o binario (y una cadena vacía es el valor predeterminado para los campos sin ningún conjunto predeterminado). También uso binary (16) para almacenar mi UUID para el espacio de almacenamiento más eficiente y la velocidad de consulta ... si no quiere lidiar con las complejidades de los campos binarios, puede simplemente usar UUID() en lugar de UNHEX(REPLACE(UUID(),'-','')) con un char (36) campo.

Cuestiones relacionadas