223 votes

Valeur par défaut non valide pour le champ d'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 ?

206voto

Devart Points 52715

C'est à cause du mode SQL du serveur - NO_ZERO_DATE .

A partir de la référence : NO_ZERO_DATE - En mode strict, n'autorise pas '0000-00-00' comme date valide. Vous pouvez toujours insérer des dates zéro avec l'option IGNORE. Lorsqu'il n'est pas en mode strict, la date est acceptée mais un avertissement est généré.

186voto

Pankaj Shrestha Points 1581

Si vous avez généré le script à partir du plan de travail MySQL.

La ligne suivante est générée

 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

Supprimez 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';

69voto

Bret VvVv Points 679

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 comprise dans cette plage.

Autre comportement étrange et apparenté :

 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 souhaitez insérer des NULLS :

 CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);

47voto

Mubashar Abbas Points 1928

Dans Ubuntu Desktop 16.04, j'ai fait ceci :

  1. fichier ouvert : /etc/mysql/mysql.conf.d/mysqld.cnf dans un éditeur de votre choix.

  2. Recherchez : sql_mode , ce sera quelque part sous [mysqld] .

  3. et définissez sql_mode sur les valeurs suivantes :

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Enregistrez puis redémarrez le service mysql en faisant :

    sudo service mysql restart

21voto

Ashish Odich Points 193

Définissez simplement les lignes suivantes en haut de votre fichier SQL de base de données.

 SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

Ça marche pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X