¿Puedo usar una función para un valor predeterminado en MySql?

Quiero hacer algo como esto:

create table app_users ( app_user_id smallint(6) not null auto_increment primary key, api_key char(36) not null default uuid() ); 

Sin embargo, esto da como resultado un error, ¿hay alguna manera de llamar a una función para un valor predeterminado en mysql?

Gracias.

No, no puedes.

Sin embargo, puede crear fácilmente un disparador para hacer esto, como por ejemplo:

 CREAR TRIGGER before_insert_app_users
   ANTES DE INSERTAR EN app_users 
   POR CADA FILA
   SET new.api_key = uuid ();

Como ya dije, no puedes.

Si desea simular este comportamiento, puede utilizar un desencadenador 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; 

Aún debe actualizar las filas previamente existentes, como esta:

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

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ó UUID recientemente 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

Creo que no puedes :

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

No estoy seguro si las respuestas anteriores son para una versión anterior, pero vi en alguna parte que puede hacer esto usando la función unhex (). Lo intenté y funciona. (maria db versión 10.2)

Tu puedes hacer

 .... column_name binary(16) not null default unhex(replace(uuid(),'-','')) 

y funciona. Para ver el uuid simplemente haz el hex (column_name).

Tenga en cuenta que el UUID() de MySQL UUID() devuelve CHAR(36) y que el almacenamiento de los UUID como texto (como se muestra en las otras respuestas) es obviamente ineficiente. En su lugar, la columna debe ser BINARY(16) , y puede usar UUID_TO_BIN() al insertar datos y BIN_TO_UUID() cuando la vuelve a leer.

 CREATE TABLE app_users ( app_user_id SMALLINT(6) NOT NULL AUTO_INCREMENT PRIMARY KEY, api_key BINARY(16) ); CREATE TRIGGER before_insert_app_users BEFORE INSERT ON app_users FOR EACH ROW IF new.api_key IS NULL THEN SET new.api_key = UUID_TO_BIN(UUID()); END IF; 

Tenga en cuenta que dado que MySQL realmente no sabe que esto es un UUID, puede ser difícil solucionar problemas almacenados como binarios. En este artículo se explica cómo crear una columna generada que convierta el UUID a texto según sea necesario sin ocupar ningún espacio o preocupándose por mantener separadas las versiones binarias y de texto en sincronización: https://mysqlserverteam.com/storing-uuid-values-in -mysql-tables /