2008-11-06 12 views

Respuesta

97

No, no se puede.

Sin embargo, usted puede fácilmente crear un disparador para ello, tales como:

 
CREATE TRIGGER before_insert_app_users 
    BEFORE INSERT ON app_users 
    FOR EACH ROW 
    SET new.api_key = uuid(); 
+1

@Ver http://stackoverflow.com/questions/6280789/generate-guid-in-mysql-for-existing-data para rellenar UUID en filas existentes. –

+1

Esto no es lo mismo que tener un valor DEFAULT. ¿Cómo cambiaría esta respuesta para establecer solo la clave si el valor era NULL? – ToolmakerSteve

+0

Lo modifiqué con md5 (uuid()) y funcionó bien. ¿Estaba bien mi enfoque? –

8

Desafortunadamente no, MySQL 5 requiere constantes para el valor predeterminado. El problema se discutió con mucho más detalle en el siguiente enlace. Pero la única respuesta es permitir nulo y agregar un desencadenante de tabla.

MySQL solo aceptó recientemente el UUID como parte de su paquete DB, y no es tan rico en funciones como nos gustaría.

http://www.phpbuilder.com/board/showthread.php?t=10349169

+0

debo añadir que permite NULL y confiar en los desencadenadores puede funcionar, pero la mayoría de los desarrolladores lo consideran una solución muy hack-y. No lo recomendaría personalmente, sino a cada uno. – TravisO

5

Creo you can't:

el valor predeterminado debe ser una constante; no puede ser una función o una expresión

+0

No es cierto, puede usar getdate() –

+5

@amrosama - No, no puede. 'getdate()' ni siquiera es una función MySQL. El enlace en la respuesta explica la única excepción: * «puede especificar CURRENT_TIMESTAMP como predeterminado para una columna TIMESTAMP» *. –

+0

CURRENT_TIMESTAMP es la única "función" que se puede usar como valor predeterminado. Todo lo demás debe ser una constante (por desgracia). –

16

Como ya se ha indicado, no se puede.

Si desea simular este comportamiento, puede utilizar un disparador de esta manera:

CREATE TRIGGER before_insert_app_users 
BEFORE INSERT ON app_users 
FOR EACH ROW 
    IF new.uuid IS NULL 
    THEN 
    SET new.uuid = uuid(); 
    END IF; 

usted todavía tiene que actualizar filas previamente existentes, como esto:

UPDATE app_users SET uuid = (SELECT uuid()); 
+0

Obtengo un error de sintaxis con este código. Parece que la llamada a uuid() no está permitida dentro del bloque FOR EACH ROW. ¿Alguna sugerencia? –

+1

¿Qué versión de mysql estás usando? He intentado esta sintaxis para 5.5 y funciona. En la alternativa, intente reemplazar 'uuid()' con '(SELECT uuid())' – Pamput

Cuestiones relacionadas