2008-11-19 14 views
6

tengo la siguiente tabla en MySQL (versión 5):MySQL: la adición año actual como un valor predeterminado para un campo 'año'

id int(10)  UNSIGNED    No auto_increment     
year varchar(4) latin1_swedish_ci No    
title varchar(250) latin1_swedish_ci Yes NULL   
body text   latin1_swedish_ci Yes NULL 

Y quiero la db para auto añadir el año en curso en el inserto , he intentado lo siguiente instrucción SQL:

ALTER TABLE `tips` CHANGE `year` `year` VARCHAR(4) NOT NULL DEFAULT year(now()) 

pero da el siguiente error:

1067 - Invalid default value for 'year' 

¿Qué puedo hacer para conseguir este divertido cionalidad? ¡Gracias por adelantado!

@ gabriel1863: Gracias por la respuesta, pero sigo recibiendo el mismo error. Incluso cuando uso los apoyos en el campo del año.

¡Gracias a todos por la ayuda!

+0

que tienen columnas con el mismo nombre que un tipo de datos suele ser una idea realmente mala – warren

Respuesta

14

The DEFAULT value clause in a data type specification indicates a default value for a column. With one exception, the default value must be a constant; it cannot be a function or an expression. This means, for example, that you cannot set the default for a date column to be the value of a function such as NOW() or CURRENT_DATE. The exception is that you can specify CURRENT_TIMESTAMP as the default for a TIMESTAMP column.

-- MySQL Manual

Puede, sin embargo, escribir una trigger que establece el valor. Desearía poder ayudar, pero no estoy muy familiarizado con la escritura de procedimientos almacenados en MySQL.

creo que esto funcionaría:

CREATE TRIGGER ins_year 
BEFORE INSERT ON tips 
    FOR EACH ROW SET NEW.year = YEAR(NOW()); 
7

El siguiente debería funcionar:

ALTER TABLE tips MODIFY COLUMN year YEAR(4) NOT NULL DEFAULT CURRENT_TIMESTAMP 

favor ver Year Data Type para más información.

Por lo tanto, probé esto una vez que obtuve acceso y no funciona. Como señalaba otro cartel, CURRENT_TIMESTAMP solo funciona en el tipo de datos TIMESTAMP.

¿Existe un problema específico con el almacenamiento de una marca de tiempo completa y solo utiliza el año en el código? Si no, entonces recomendaría almacenar este valor como una marca de tiempo.

Su otra opción sería la creación de un trigger:

CREATE TRIGGER example_trigger AFTER INSERT ON tips 
FOR EACH ROW BEGIN 
UPDATE tips SET year = YEAR(NOW()) WHERE tip_id = NEW.tip_id 
END; 

De lo contrario, asignar este valor a la instrucción INSERT desde el código.

La mejor solución en su caso dependerá completamente de las circunstancias que rodean su aplicación particular.

+0

Bella, que estaba buscando exactamente lo mismo hoy! – Tom

Cuestiones relacionadas