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?

130
demandé sur robert 2012-02-08 15:01:42

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é.

135
répondu Devart 2016-03-03 03:11:07

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';
95
répondu Pankaj Shrestha 2018-08-02 08:57:39

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);
30
répondu Bret VvVv 2016-05-24 18:07:17

Dans ubuntu desktop 16.04, j'ai fait ceci:

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

  2. Rechercher: sql_mode, il sera quelque part dans [mysqld].

  3. Et définir sql_mode comme suit:

    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

23
répondu Mubashar Abbas 2018-06-13 01:06:02

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é.

8
répondu Joy Zhu 2017-01-12 03:07:47

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
8
répondu dgitman 2017-07-05 11:47:52

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

3
répondu pyb 2017-10-19 18:53:51

Pour éviter ce problème, vous devez supprimer NO_ZERO_DATE de la configuration du mode mysql.

  1. allez à 'phpmyadmin'.
  2. Une fois que phpmyadmin est chargé, cliquez sur l'onglet' variables'.
  3. Recherchez 'mode sql'.
  4. 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.

3
répondu Antonio Reyes 2018-05-09 00:57:04

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.

1
répondu Robert Hook 2017-07-27 12:33:11

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
1
répondu Jatin Bhatti 2017-11-01 10:45:49

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',
0
répondu Lucas Bustamante 2018-04-06 14:59:04

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.

0
répondu David Beckwith 2018-06-17 03:23:57