• [^] # Re: normal

    Posté par . 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 :

    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.

    CREATE TABLE t
    (
     ts1 TIMESTAMP NULL DEFAULT NULL,
     ts2 TIMESTAMP NULL DEFAULT 0,
     ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
    );
    
    

    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.