2008-12-11 19 views

Respuesta

14

MySQL no soporta columnas o expresiones calculadas en la opción DEFAULT de una definición de columna.

Usted puede hacer esto en un disparador (MySQL 5.0 o superior requiere):

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors 
FOR EACH ROW 
BEGIN 
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname); 
END 

También es posible que desee crear un disparador similares BEFORE UPDATE.

Cuidado con NULL en nombre y un apellido, porque concat de un NULL con cualquier otra cadena produce una NULL. Utilice COALESCE() en cada columna o en la cadena concatenada según corresponda.

editar: El siguiente ejemplo establece stage_name solo si es NULL. De lo contrario, se puede especificar el stage_name en su estado de cuenta INSERT, y va a ser conservado.

CREATE TRIGGER format_stage_name 
BEFORE INSERT ON actors 
FOR EACH ROW 
BEGIN 
    IF (NEW.stage_name IS NULL) THEN 
    SET NEW.stage_name = CONCAT(NEW.forename, ' ', NEW.surname); 
    END IF; 
END 
+0

No he utilizado MySQL, pero esto siempre sobrescribir la columna con el valor concatenado? Si quieres que actúe como predeterminado, deberías poder anularlo, por lo que creo que también necesitarías unirme en el NEW.stage_name. –

+0

@ bill-karwin Recibo un error de sintaxis en 'NEW.aka = CONCAT (NEW.fname, '', NEW.lname)' ... vea el comando completo [** aquí en pastebin **] (http : //pastebin.com/FiEUBgcu) ... ¿Alguna sugerencia? – mOrloff

+0

@mOrloff, olvidé la palabra clave 'SET'. He editado el código de arriba para corregir esto. –

2

Según 10.1.4. Data Type Default Values no, usted no puede hacer eso. Solo puede usar una constante o CURRENT_TIMESTAMP.

OTOH si está bastante actualizado, probablemente pueda usar un trigger para lograr lo mismo.

2

Lo primero que pensé es que si tienes los dos valores en otros campos lo que es la necesidad imperiosa de almacenamiento redundante en un tercer campo? Va en contra de la normalización y la eficiencia.

Si simplemente desea almacenar el valor concatenado, puede simplemente crear una vista (o IMSNHO aún mejor un procedimiento almacenado) que concatena los valores en un campo pseudo actor y realizar sus lecturas desde la vista/sproc en lugar del tabla directamente.

Si es absolutamente necesario almacenar el valor concatenado se podía manejar esto de dos maneras:

1) utilizar un procedimiento almacenado para hacer sus inserciones en lugar de SQL recta. De esta manera usted puede recibir los valores y construir un valor para el campo que desea llenar luego construir la instrucción de inserción que incluye un valor para el campo concatenado actores.

2) Así que no dibujar demasiadas llamas, trate esta sugerencia con guantes para niños. Úselo solo como último recurso. Podría hackear este comportamiento agregando un disparador para construir el valor si se deja nulo. En general, los factores desencadenantes no son buenos.Agregan costos e interacciones invisibles a interacciones bastante simples. Sin embargo, puede usar CREATE TRIGGER para actualizar el campo de actores después de insertar o actualizar un registro. Esta es la página de referencia:

http://dev.mysql.com/doc/refman/5.0/en/create-trigger.html

+0

Aunque el valor predeterminado es el valor concatenado, eso no significa que el valor predeterminado no se pueda anular en la inserción o que se actualice posteriormente –

Cuestiones relacionadas