Ungültiger Standardwert für das Zeitstempelfeld 'create_date'

186

Ich habe die folgende SQL-Create-Anweisung

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;

folgenden Fehler geben

ERROR 1067 (42000): Invalid default value for 'create_date'

Was ist der Fehler hier?

Robert
quelle
Ich kann nichts falsches an Ihrer Anfrage sehen und sie funktioniert in der gerade getesteten 5.1.50-Community.
Jaspreet Chahal
Die Abfrage ist auch in meinem Ende in Ordnung.
Shakti Singh
Nicht sicher, aber geben Sie diesem Feld einen anderen Namen und versuchen Sie es?
Naveen Kumar
Ich benutze MySQL 5.1.56 Community in Ubuntu 10.04. und nicht arbeiten
Robert
5
Das Datum ohne Null erfordert ein Datum. Verwenden Sie '1970-01-01 00:00:01'. [von hier genommen] [1] [1]: dba.stackexchange.com/questions/6171/…
Jadeye

Antworten:

175

Dies liegt am Server-SQL-Modus - NO_ZERO_DATE .

Aus der Referenz: NO_ZERO_DATE- Im strengen Modus kein '0000-00-00'gültiges Datum zulassen . Mit der Option IGNORE können Sie weiterhin Nulldaten einfügen . Wenn Sie sich nicht im strengen Modus befinden, wird das Datum akzeptiert, es wird jedoch eine Warnung generiert.

Devart
quelle
18
Wie gebe ich die Option zum Ignorieren?
Robert
9
Sie können diese Option nicht ignorieren. Dies ist eine Serveroption. Wenn Sie Zugriff auf my.ini (MySQL-Konfigurationsdatei) haben, entfernen Sie NO_ZERO_DATE aus der Option SQL-Modus und starten Sie den Server neu.
Devart
7
Um diese Option zu aktivieren, führen Sie SHOW VARIABLES LIKE 'sql_mode'
Devart
6
Ich habe das Skript mit MySQL Workbench generiert. Im Skript wird der sql_mode auf traditionell gesetzt. Wenn ich das traditionelle entferne, funktioniert das Skript.
Robert
17
Wechseln Sie in den MySQL Workbench-Einstellungen zur Registerkarte 'Modell: MySQL'. Dort wurde 'SQL_MODE zur Verwendung in generierten Skripten' auf "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION" gesetzt, wodurch das Problem endgültig gelöst wird.
sgtdck
140

Wenn Sie das Skript über die MySQL-Workbench generiert haben.

Die folgende Zeile wird generiert

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

Entfernen Sie TRADITIONAL aus SQL_MODE, und dann sollte das Skript einwandfrei funktionieren

Andernfalls können Sie SQL_MODE als Ungültige Daten zulassen festlegen

SET SQL_MODE='ALLOW_INVALID_DATES';
Pankaj Shrestha
quelle
1
Ersparte mir einige Zeit bei der Suche, warum zum Teufel es nicht funktioniert :)
Srneczek
5
Ahhh danke. SET SQL_MODE = 'ALLOW_INVALID_DATES'; war ein Lebensretter. Ich hatte dieses Problem, als ich versuchte, eine WordPress-Site auf einen anderen Server (beide lokal) zu migrieren, und konnte die Datenbankdaten aufgrund dieses Fehlers nicht importieren, obwohl die Tabellen mit diesem Fehler keine Zeilen enthielten.
Mikato
Lief wie am Schnürchen! Danke dir.
moreirapontocom
52

TIMESTAMP hat einen Bereich von '1970-01-01 00:00:01' UTC bis '2038-01-19 03:14:07' UTC (siehe Dokument ). Der Standardwert muss innerhalb dieses Bereichs liegen.

Andere seltsame, verwandte Verhaltensweisen:

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)

Randnotiz, wenn Sie NULL einfügen möchten:

CREATE TABLE tbl4 (
    ts TIMESTAMP NULL DEFAULT NULL);
Bret VvVv
quelle
1
Das passiert mir. Was ist los? ts2 ist nicht einmal "NICHT NULL" ...!
PedroD
2
Möglicherweise liegt dies daran, dass "Wenn Sie keinen Wert für die erste TIMESTAMP-Spalte in einer Tabelle festlegen, weist MariaDB ihr automatisch das aktuelle Datum und die aktuelle Uhrzeit zu, wenn Sie eine UPDATE- oder INSERT-Abfrage für die betreffenden Zeilen durchführen." - MariaDB Docs
jsphpl
1
Ich mag die Verwendung von column_name TIMESTAMP DEFAULT NOW(). Vielleicht nicht für jede Situation geeignet, aber ich dachte, ich würde es teilen, da ich mich auch damit befasste.
DeezCashews
1
Spaltenname TIMESTAMP DEFAULT '1970-01-01 00:00:01' hat den Trick für mich gemacht. Vielen Dank!
Metafa
41

In Ubuntu Desktop 16.04 habe ich Folgendes getan:

  1. Datei öffnen: /etc/mysql/mysql.conf.d/mysqld.cnfin einem Editor Ihrer Wahl.

  2. Suche: sql_mode , es wird irgendwo unter sein [mysqld].

  3. und sql_modeauf Folgendes einstellen :

    NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

  4. Speichern Sie den MySQL-Dienst und starten Sie ihn neu.

    sudo service mysql restart

Mubashar Abbas
quelle
8
Es hat geholfen, außer dass das sql_modefür meine Instanz von mySQL auf ubuntu16.04 nicht da war. Ich musste einen Eintrag dafür in die Datei einfügen, indem ich "NO_ZERO_DATE" entfernte. So, hier ist , wie es jetzt aussieht: #Adding die unterhalb der Linie loswerden 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_SUBSTITUTION
OK999
Sie haben Recht. Ich habe das früher hinzugefügt, um den strengen Modus zu deaktivieren. Als ich ihn für dieses spezielle Problem bearbeitet habe, war der sql_modeEintrag bereits vorhanden.
Mubashar Abbas
Ist das ein Fehler? CURRENT_TIMESTAMP sollte niemals "0000-00-00 00:00:00" zurückgeben, oder irre ich mich? Warum sollte ich die mysqld-Einstellungen ändern müssen?
Lass uns am
@letsjump, weil jemand Ihren MySQL-Server falsch konfiguriert hat. Ich habe dieses Problem mit einer Datenbank, die ich importiert habe. Der Standardwert für den Zeitstempel in einer Spalte ist kein gültiger Zeitstempelwert. Der REAL-Fix besteht darin, den Standardzeitstempel auf einen Wert wie 1970 zu aktualisieren - das früheste verfügbare Datum. Die vorübergehende Problemumgehung besteht darin, die Überprüfung der Datenbank zu deaktivieren.
anon58192932
9

Mit OS X installieren mysql von Homebrew , Systemvariablen basierend auf seiner mitkompilierten Defaults. Die Lösung besteht darin, "NO_ZERO_DATE" aus den Systemvariablen "sql_mode" zu entfernen.

Bitte beachten Sie nur, dass der Umfang dies beinhaltet.

Wenn Sie nur in Ihrer Sitzung etwas bewirken möchten, verwenden "@@session"Sie beispielsweise Folgendes :

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

In diesem Fall hat dies keine Auswirkungen, sobald Ihre Sitzung endet oder Sie sie ändern. Es hat keine Auswirkungen auf andere Sitzungen.

Wenn Sie alle Clients betreffen möchten, verwenden Sie "@@global"zum Beispiel:

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

In diesem Fall betrifft dies nur die Clients, die nach der Änderung eine Verbindung herstellen (nicht alle aktuellen Clients) und funktioniert nach dem Beenden des Servers nicht mehr.

Joy Zhu
quelle
8

Ich konnte dieses Problem unter OS X beheben, indem ich MySQL von Homebrew aus installierte

brew install mysql

indem Sie Folgendes zu /usr/local/etc/my.cnf hinzufügen

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

und Neustart von MySQL

brew tap homebrew/services
brew services restart mysql
Dgitman
quelle
7

Ich hatte ein ähnliches Problem mit MySQL 5.7 mit dem folgenden Code:

`update_date` TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP

Ich habe dies stattdessen behoben:

`update_date` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

pyb
quelle
2
Ich denke, dies ist tatsächlich die beste Option, wenn es sinnvoll ist, die Standardeinstellung "Aktuell" zu verwenden. Für den Geburtszeitstempel ist dies jedoch nicht sinnvoll - nur als Beispiel.
Miau
7

Um dieses Problem zu vermeiden, müssen Sie NO_ZERO_DATEdie Konfiguration im MySQL-Modus entfernen .

  1. Gehen Sie zu 'phpmyadmin'.
  2. Sobald phpmyadmin geladen ist, klicken Sie auf die Registerkarte 'Variablen'.
  3. Suchen Sie nach 'SQL-Modus'.
  4. Klicken Sie auf die Option Bearbeiten und entfernen Sie NO_ZERO_DATE(und das nachfolgende Komma) aus der Konfiguration.

Dies ist ein sehr häufiges Problem in der lokalen Umgebung mit wamp oder xamp.

Antonio Reyes
quelle
6

Definieren Sie einfach die folgenden Zeilen oben in Ihrer Datenbank-SQL-Datei.

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

Es funktioniert für mich.

Ashish Odich
quelle
2

So deaktivieren Sie den strengen SQL-Modus

Create disable_strict_mode.cnf file at /etc/mysql/conf.d/

Geben Sie in die Datei die folgenden zwei Zeilen ein:

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Starten Sie MySQL abschließend mit folgendem Befehl neu:

sudo service mysql restart
Jatin Bhatti
quelle
1

Möglicherweise möchten Sie die Zeitzoneneinstellung in der MySql-Instanz überprüfen:

mysql> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | SYSTEM |
+---------------+--------+

In meinem Fall wurde mir klar, dass für das zugrunde liegende System die Zeitzone auf BST anstatt auf UTC eingestellt war, und daher wurde in der Erstellungs-Tabelle der Standardwert von '1970-01-01 00:00:01' um 1 Stunde zurückgedrängt, was dazu führte ein ungültiger Zeitstempelwert.

Für mich wollte ich eigentlich, dass die Zeitzone der Maschine auf UTC eingestellt ist, und das hat mich geklärt. Als ich Centos / 7 ausführte, tat ich es einfach

# timedatectl set-timezone UTC

und alles neu gestartet.

Robert Hook
quelle
1

Standardwerte sollten ab dem Jahr 1000 beginnen.

Beispielsweise,

ALTER TABLE mytable last_active DATETIME DEFAULT '1000-01-01 00:00:00'

Hoffe das hilft jemandem.

David Beckwith
quelle
1

Ändere das:

`create_date` TIMESTAMP NOT NULL DEFAULT  '0000-00-00 00:00:00',
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP  ,

Zu dem Folgendem:

`create_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ,
`update_date` TIMESTAMP NOT NULL DEFAULT  CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ,
荒木 知
quelle
1
Aus der Bewertung: Hallo, bitte antworten Sie nicht nur mit dem Quellcode. Versuchen Sie, eine schöne Beschreibung der Funktionsweise Ihrer Lösung zu geben. Siehe: Wie schreibe ich eine gute Antwort? . Danke
sɐunıɔ ןɐ qɐp
Wenn dies eine WordPress-Site ist, aktualisieren Sie bitte nicht die Core WordPress-Tabellen. Viele Plugins erwarten einen Wert von Zeores, daher kann WordPress diesen Standardwert aus früheren Gründen, die Plugins beschädigen würden, nicht ändern. Wordpress-Thread und Wordpress-Unterstützung . Das Ändern der Datenbankstruktur ohne Kenntnis des Codes anhand der Standardwerte kann zu Problemen führen. Während dies in vielen Fällen als Lösung funktionieren kann, kann es in anderen Fällen zu Chaos führen. Keine universelle Lösung.
SherylHohman
0

Sie können dies einfach ändern:

`create_date` TIMESTAMP NOT NULL DEFAULT '0000-00-00 00:00:00',

Zu so etwas:

`create_date` TIMESTAMP NOT NULL DEFAULT '2018-04-01 12:00:00',
Lucas Bustamante
quelle