2011-04-16 5 views
2

Je tente de créer la table avec la colonne commeMySQL valeur par défaut - AN (CURRENT_DATE)

model_year smallint(4) not null default YEAR(CURRENT_DATE) 

Mais il y a une erreur (valeur par défaut non valide). Que puis-je faire pour définir la valeur par défaut pour l'année en cours model_year?

+0

pensez-vous avoir des années négatives comme l'année -1989? donc cela devrait être smallint non signé non nul - pensez-y. et supprimez le spécificateur de largeur d'affichage optionnel (4) car vous n'utilisez pas zerofill !! –

Répondre

3

De l'MySQL doc pages (mon gras):

La clause de valeur DEFAULT dans une spécification de type de données indique une valeur par défaut pour une colonne. Avec une exception, la valeur par défaut doit être une constante; il ne peut pas s'agir d'une fonction ou d'une expression. Cela signifie, par exemple, que vous ne pouvez pas définir la valeur par défaut d'une colonne de date comme étant NOW() ou CURRENT_DATE. L'exception est que vous pouvez spécifier CURRENT_TIMESTAMP comme valeur par défaut pour une colonne TIMESTAMP.

Je suppose que vous devrez spécifier la valeur réelle lorsque vous insérez la ligne.


Si vous ne voulez pas faire cela, vous pouvez permettre NULLs puis balayer périodiquement la base de données avec un autre processus faisant:

update table mytable set model_year = year(current_date) where model_year is null 

mais c'est une bidouille, et plutôt dangereux pour boot, car il y aura une période de temps où les valeurs NULL existent dans la colonne.

C'est quelque chose que toutes vos requêtes devraient prendre en compte, ce qui conduit à la laideur comme:

select a, b, model_year from mytable where model_year is not null 
union all 
select a, b, year(current_date) from mytable where model_year is null 

Je vais moi-même la route par défaut.

+0

Une option consiste à utiliser une valeur magique par défaut, puis à configurer un déclencheur qui est exécuté AFTER INSERT. Ce déclencheur pourrait définir l'année en cours. – alexn

0

Vous auriez besoin d'une procédure stockée (désolé, je ne connais pas la syntaxe MySQL). Vous pouvez configurer une procédure stockée qui se déclenche sur INSERT ou UPDATE qui recherche une valeur NULL dans la colonne de l'année du modèle et la remplace par un INSERT ou UPDATE identique qui définit l'année du modèle.