J'adore cette partie de la doc MySQL, c'est je crois ma préférée :
Elle commence par expliquer comment enlever les auto-insert et les auto-update du timestamp :
Auto-initialization and auto-update:
col_name TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Auto-initialization only:
col_name TIMESTAMP DEFAULT CURRENT_TIMESTAMP
Auto-update only:
col_name TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
Neither:
col_name TIMESTAMP DEFAULT 0
Donc si on veut pas mettre le timestamp à jour il suffit de rajouter DEFAULT 0 dans la définition de la colonne
C'est d'ailleurs redonné en exemple plus tard
CREATE TABLE t (
ts1 TIMESTAMP DEFAULT 0,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
Là on voit bien, ts1 aura une valeur à 0 par défaut, et ts2 aura la valeur current_timestamp
SAUF QUE :
The following examples that use DEFAULT 0 do not work if the NO_ZERO_DATE SQL mode is enabled because that mode causes “zero” date values (specified as 0, '0000-00-00, or '0000-00-00 00:00:00') to be rejected. Be aware that the TRADITIONAL SQL mode includes NO_ZERO_DATE.
Ah oui, si on est en mode transactionnel, par défaut le 0 est en fait le #0 et ne peut pas être utilisé pour une date. C'est l'option NO_ZERO_DATE. Bon alors comme le #0 c'est un poil un standard SQL on va peut-être pas y toucher de peur des effets de bords et décider de mettre à jour à une autre date. Le truc c'est qu'il y a peut être des éléments dont on ne connais pas encore la date, ou d'autres qui n'en ont pas. Dans ce cas là on prend NULL
SAUF QUE :
By default, TIMESTAMP columns are NOT NULL, cannot contain NULL values, and assigning NULL assigns the current timestamp.
Ah merde, ils l'aiment vraiment le current_timestamp chez MySQL. Bon alors si je mets NULL, ca va me rentrer le current_timestamp et en plus je peux pas mettre 0 comme date repère… Heureusement je peux déclarer NULL comme une valeur possible.
Bon alors ts2 ne marche pas en transactionnel parce que NO_ZERO_DATE est actif par défaut. Mais avec les deux autres on devrait pouvoir s'en sortir. Cependant on a un peu pleuré quand même pour la mise en place.
Phénomène amusant : sous MySQL la première colonne définie de type timestamp qui n'a pas de default est considéré comme auto-initialisée / auto-updatée. Ce qui veut dire que si vous mettez un default 0/default 1/default NULL dans cette première colonne, la colonne de type timestamp suivante deviendra auto-updatée automatiquement. On ajoute à cela le fait que MySQL jusqu'à la version 5.6.4 prend les microsecondes, les affiche, peut faire des calculs dessus MAIS NE LES STOCKE PAS ! Il arrondit à la seconde supérieure avant de stocker.
Après les gens se demandent pourquoi sous MySQL je stocke toutes mes dates au format DECIMAL, et je fais les conversions à la volée.
[^] # Re: normal
Posté par Kaane . En réponse au journal MySQL est une bouse immonde. Évalué à 10.
J'adore cette partie de la doc MySQL, c'est je crois ma préférée :
Elle commence par expliquer comment enlever les auto-insert et les auto-update du timestamp :
Donc si on veut pas mettre le timestamp à jour il suffit de rajouter DEFAULT 0 dans la définition de la colonne
C'est d'ailleurs redonné en exemple plus tard
Là on voit bien, ts1 aura une valeur à 0 par défaut, et ts2 aura la valeur current_timestamp
SAUF QUE :
Ah oui, si on est en mode transactionnel, par défaut le 0 est en fait le #0 et ne peut pas être utilisé pour une date. C'est l'option NO_ZERO_DATE. Bon alors comme le #0 c'est un poil un standard SQL on va peut-être pas y toucher de peur des effets de bords et décider de mettre à jour à une autre date. Le truc c'est qu'il y a peut être des éléments dont on ne connais pas encore la date, ou d'autres qui n'en ont pas. Dans ce cas là on prend NULL
SAUF QUE :
Ah merde, ils l'aiment vraiment le current_timestamp chez MySQL. Bon alors si je mets NULL, ca va me rentrer le current_timestamp et en plus je peux pas mettre 0 comme date repère… Heureusement je peux déclarer NULL comme une valeur possible.
Bon alors ts2 ne marche pas en transactionnel parce que NO_ZERO_DATE est actif par défaut. Mais avec les deux autres on devrait pouvoir s'en sortir. Cependant on a un peu pleuré quand même pour la mise en place.
Phénomène amusant : sous MySQL la première colonne définie de type timestamp qui n'a pas de default est considéré comme auto-initialisée / auto-updatée. Ce qui veut dire que si vous mettez un default 0/default 1/default NULL dans cette première colonne, la colonne de type timestamp suivante deviendra auto-updatée automatiquement. On ajoute à cela le fait que MySQL jusqu'à la version 5.6.4 prend les microsecondes, les affiche, peut faire des calculs dessus MAIS NE LES STOCKE PAS ! Il arrondit à la seconde supérieure avant de stocker.
Après les gens se demandent pourquoi sous MySQL je stocke toutes mes dates au format DECIMAL, et je fais les conversions à la volée.