Valeur par défaut invalide pour le champ horodatage 'create date'
J'ai l'instruction SQL create suivante
mysql> CREATE TABLE IF NOT EXISTS `erp`.`je_menus` (
-> `id` INT(11) NOT NULL AUTO_INCREMENT ,
-> `name` VARCHAR(100) NOT NULL ,
-> `description` VARCHAR(255) NOT NULL ,
-> `live_start_date` DATETIME NULL DEFAULT NULL ,
-> `live_end_date` DATETIME NULL DEFAULT NULL ,
-> `notes` VARCHAR(255) NULL ,
-> `create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
-> `created_by` INT(11) NOT NULL ,
-> `update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ,
-> `updated_by` INT(11) NOT NULL ,
-> `status` VARCHAR(45) NOT NULL ,
-> PRIMARY KEY (`id`) )
-> ENGINE = InnoDB;
Donnant l'erreur suivante
ERROR 1067 (42000): Invalid default value for 'create_date'
Quelle est l'erreur ici?
12 réponses
C'est à cause du mode SQL du serveur - NO_ZERO_DATE .
De la référence: NO_ZERO_DATE
- en mode strict, n'autorisez pas '0000-00-00'
comme date valide. Vous pouvez toujours insérer des dates zéro avec l'option ignorer . Lorsqu'elle n'est pas en mode strict, la date est acceptée mais un avertissement est généré.
Si vous avez généré le script à partir du workbench MySQL.
La ligne suivante est générée
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
Supprime TRADITIONAL du SQL_MODE, puis le script devrait fonctionner correctement
Sinon, vous pouvez définir le SQL_MODE comme autoriser les Dates non valides
SET SQL_MODE='ALLOW_INVALID_DATES';
TIMESTAMP a une plage de '1970-01-01 00: 00: 01' UTC à '2038-01-19 03: 14: 07' UTC (voir doc ). La valeur par défaut doit être dans cette plage.
Autre comportement Impair, lié:
CREATE TABLE tbl1 (
ts TIMESTAMP);
Query OK, 0 rows affected (0.01 sec)
CREATE TABLE tbl2 (
ts TIMESTAMP,
ts2 TIMESTAMP);
ERROR 1067 (42000): Invalid default value for 'ts2'
CREATE TABLE tbl3 (
ts TIMESTAMP,
ts2 TIMESTAMP DEFAULT '1970-01-01 00:00:01');
Query OK, 0 rows affected (0.01 sec)
Note latérale, si vous voulez insérer des valeurs nulles:
CREATE TABLE tbl4 (
ts TIMESTAMP NULL DEFAULT NULL);
Dans ubuntu desktop 16.04, j'ai fait ceci:
Ouvrir le fichier:
/etc/mysql/mysql.conf.d/mysqld.cnf
dans un éditeur de votre choix.Rechercher:
sql_mode
, il sera quelque part dans[mysqld]
.-
Et définir
sql_mode
comme suit:NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
-
Enregistrez puis redémarrez le service mysql en faisant:
sudo service mysql restart
En utilisant OS X , Installez mysql à partir de Homebrew, Variables système basées sur ses valeurs par défaut compilées. La Solution consiste à supprimer "NO_ZERO_DATE" des Variables système "sql_mode".
Gardez à l'esprit que la portée implique.
Si vous souhaitez modifier uniquement dans votre session, veuillez utiliser "@@session"
, Par exemple:
SET @@session.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".
Dans ce cas, cela n'affectera pas une fois que votre session se termine ou que vous la modifiez. Il n'a pas d'effet sur l'autre session.
Si vous voulez affecter sur tous les clients, veuillez utiliser "@@global"
, par exemple:
SET @@global.sql_mode ="ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION".
Dans ce cas, cela n'affecte que les clients qui se connectent après la modification(n'affecte pas tous les clients actuels) et ne fonctionnera pas une fois le serveur terminé.
J'ai pu résoudre ce problème sur OS X en installant MySQL à partir de Homebrew
brew install mysql
En ajoutant ce qui suit à /usr / local/etc / my.cnf
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Et redémarrer MySQL
brew tap homebrew/services
brew services restart mysql
J'ai eu un problème similaire avec MySQL 5.7 avec le code suivant:
`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP
J'ai corrigé en utilisant ceci à la place:
`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
Pour éviter ce problème, vous devez supprimer NO_ZERO_DATE
de la configuration du mode mysql.
- allez à 'phpmyadmin'.
- Une fois que phpmyadmin est chargé, cliquez sur l'onglet' variables'.
- Recherchez 'mode sql'.
- Cliquez sur L'option Modifier et supprimez
NO_ZERO_DATE
(et sa virgule de fin) de la configuration.
C'est un problème très commun dans l'environnement local avec wamp ou xamp.
Vous pouvez examiner le paramètre de fuseau horaire sur L'instance MySql:
mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| time_zone | SYSTEM |
+---------------+--------+
Dans mon cas, j'ai réalisé que le système sous-jacent avait son fuseau horaire défini sur BST plutôt que sur UTC, et donc dans la table create la valeur par défaut de '1970-01-01 00:00:01' était contrainte 1 heure, entraînant une valeur d'horodatage invalide.
Pour moi, je voulais en fait que le fuseau horaire de la machine soit défini sur UTC, et cela m'a réglé. Comme je courais Centos / 7, Je l'ai simplement fait
# timedatectl set-timezone UTC
Et redémarré tout.
Pour désactiver le mode SQL strict
Create disable_strict_mode.cnf file at /etc/mysql/conf.d/
Dans le fichier, entrez ces deux lignes:
[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Enfin, redémarrez MySQL avec cette commande:
sudo service mysql restart
Vous pouvez simplement changer ceci:
`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',
À quelque chose comme ceci:
`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
Les valeurs par défaut doivent commencer à partir de l'année 1000.
Par exemple
ALTER TABLE MYTABLE last_active DATETIME DEFAULT '1000-01-01 00:00:00'
J'espère que cela aide quelqu'un.