web-dev-qa-db-fra.com

Pourquoi MySQL lance la "valeur par défaut non valide pour le champ" uniquement lorsque deux champs d'horodatage ou plus existent dans la déclaration Créer?

Dans MySQL 5.7.28, je crée une table comme celle-ci:

create table t1 (
id int not null,
d1 timestamp) 
engine=innodb;

qui fonctionne bien et crée d1 comme non-null avec default value current_timetamp, on update current_timestamp.

Mais lorsque j'essaie de créer la même table avec un deux champs horodatames comme ci-dessous:

create table t1 (
id int not null,
d1 timestamp,
d2 timestamp) 
engine=innodb;

Je reçois une erreur:

Erreur SQL (1067): valeur par défaut non valide pour 'D2'

Pourquoi je reçois une erreur seulement quand j'ajoute un deuxième horodatage champ?
[.____] Est-ce un bug ou un comportement attendu dans MySQL?

3
Marinos An

Ce comportement est décrit dans explicit_defaults_for_timeStamp variable système qui est par défaut désactivé pour 5.6, 5.7 (et effectivement désactivé sur 5.1) et c'est activé dans 8.0.

Ciblage de la liaison ci-dessus:

(5.7) Si Explicit_DefaultS_for_TimeStampam est désactivé , le serveur permet les comportements non standard et gère les colonnes horodatages comme suit:

  • Les colonnes horodatées non explicitement déclarées avec l'attribut NULL sont automatiquement déclarées avec l'attribut NON NULL. Affectant une telle colonne Une valeur de NULL est autorisée et définit la colonne sur l'horodatage actuel.
  • La première colonne horodatage d'une table, si elle n'est pas explicitement déclarée avec l'attribut NULL ou une défaillance explicite ou sur la mise à jour
    Attribut, est automatiquement déclaré avec la valeur par défaut
    actuel_timettamp et sur mise à jour des attributs actuels_timettamp.
  • Colonnes de l'horodatage suivant la première, si elle n'est pas explicitement déclarée avec l'attribut NULL ou un attribut par défaut explicite, sont automatiquement déclarés par défaut '0000-00-00 00:00:00' (l'horodatage "zéro"). Pour les lignes insérées qui spécifient aucune valeur explicite pour une telle colonne, la colonne est attribuée '0000-00-00 00:00:00' et aucun avertissement ne se produit.

Selon que Le mode SQL strict ou le mode SQL no_zero_Date est activé, une valeur par défaut de '0000-00-00 00:00:00' peut être invalide .

Maintenant le problème avec 5.7 est-ce NO_ZERO_DATE Le mode est activé. Ceci est non autorisé la valeur par défaut de 0000-00-00 00:00:00 Lequel comme décrit dans la documentation serait ajouté en tant que valeur par défaut (s'il n'est pas explicitement déclaré) In Colonnes horodatampes suivant la première.

Mysql 8.0 a toujours le NO_ZERO_DATE Mode activé, mais le explicit_defaults_for_timestamp Envevar est par défaut activé qui, selon la Documentation , il ajouterait NULL comme la valeur par défaut Voir ci-dessous (quel ne provoque aucune erreur sur la création de table ):

(8.0) Si Explicit_defaultS_for_TimeStamp est activé , le serveur désintègre les comportements non standard et gère les colonnes horodaques comme suit:

[..]

  • Les colonnes horodaques non explicitement déclarées avec l'attribut NON NULL sont automatiquement déclarées avec l'attribut NULL et permettent aux valeurs null. Affectant une telle colonne Une valeur de NULL le définit à NULL, pas l'horodatage actuel.

[..]

  • La première colonne d'horodatage d'une table n'est pas traitée différemment des colonnes horodatampes suivant la première.

Ce problème a également été discuté sur suivi de la question de MySQL mais a marqué comme "pas un bogue".

Comme @akina mentionné dans les commentaires, ne vous fiez pas à des valeurs par défaut. Écrivez toujours la spécification complète du champ.

3
leopal