J'ai l'instruction de création SQL 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?
Réponses:
Cela est dû au mode SQL du serveur - NO_ZERO_DATE .
D'après la référence:
NO_ZERO_DATE
- En mode strict, ne pas autoriser'0000-00-00'
comme date valide. Vous pouvez toujours insérer des dates nulles avec l' option IGNORE . Lorsqu'il n'est pas en mode strict, la date est acceptée mais un avertissement est généré.la source
Si vous avez généré le script à partir de l'atelier 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 SQL_MODE comme Autoriser les dates non valides
SET SQL_MODE='ALLOW_INVALID_DATES';
la source
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)
Remarque latérale, si vous souhaitez insérer des NULLS:
CREATE TABLE tbl4 ( ts TIMESTAMP NULL DEFAULT NULL);
la source
column_name TIMESTAMP DEFAULT NOW()
. Peut-être ne convient pas à toutes les situations, mais je pensais que je partagerais car je traitais aussi de cela.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.Cherchez:,
sql_mode
ce sera quelque part sous[mysqld]
.et réglez
sql_mode
sur ce qui 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
la source
sql_mode
n'était pas là pour mon instance de mySQL sur ubuntu16.04. J'ai dû ajouter une entrée pour cela dans le fichier, en supprimant le "NO_ZERO_DATE". Donc, voici à quoi il ressemble maintenant: #Adding la ligne ci - dessous pour se débarrasser de no_zero_date sql_mode = ONLY_FULL_GROUP_BY, STRICT_TRANS_TABLES, NO_ZERO_IN_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTIONsql_mode
entrée était déjà là.Sous OS X , installez mysql depuis Homebrew , les variables système en fonction de ses valeurs par défaut compilées. La solution consiste à supprimer "NO_ZERO_DATE" des variables système "sql_mode".
Veuillez garder à l'esprit que la portée implique.
Si vous souhaitez affecter 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 votre session terminée ou votre modification. Cela n'a pas d'effet sur les autres sessions.
Si vous souhaitez affecter 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 fermé.
la source
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
et redémarrer MySQL
la source
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
la source
Pour éviter ce problème, vous devez supprimer
NO_ZERO_DATE
de la configuration du mode mysql.NO_ZERO_DATE
(et sa virgule de fin) de la configuration.C'est un problème très courant dans l'environnement local avec wamp ou xamp.
la source
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.
la source
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:
Enfin, redémarrez MySQL avec cette commande:
la source
Vous voudrez peut-être 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 réglé sur BST plutôt que sur UTC, et donc dans la table de création, la valeur par défaut de `` 1970-01-01 00:00:01 '' était forcée en arrière d'une heure, ce qui entraînait une valeur d'horodatage non valide.
Pour moi, je voulais en fait que le fuseau horaire de la machine soit réglé sur UTC, et cela m'a arrangé. Comme j'utilisais Centos / 7, j'ai simplement fait
# timedatectl set-timezone UTC
et tout redémarré.
la source
Les valeurs par défaut doivent commencer à partir de l'an 1000.
Par exemple,
ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'
J'espère que cela aide quelqu'un.
la source
Change ça:
Aux suivants:
`create_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP , `update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
la source
Vous pouvez simplement changer ceci:
À quelque chose comme ça:
la source
Vous pouvez simplement changer ceci:
create_date
datetime NOT NULL DEFAULT '0000-00-00 00:00:00',À quelque chose comme ça:
create_date
varchar (80) NOT NULL DEFAULT '0000-00-00 00:00:00',la source
J'essaie de définir le type de colonne comme «horodatage» et cela fonctionne pour moi.
la source