FEHLER 1067 (42000): Ungültiger Standardwert für 'created_at'

94

Als ich versuchte, die Tabelle zu ändern, zeigte es den Fehler:

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

Ich habe nach diesem Fehler gegoogelt, aber alles, was ich gefunden habe, war, als ob sie versucht hätten, den Zeitstempel so zu ändern, dass er auftrat. Hier versuche ich jedoch, eine neue Spalte hinzuzufügen, und es wird folgende Fehlermeldung angezeigt:

mysql> ALTER TABLE investments ADD bank TEXT;
ERROR 1067 (42000): Invalid default value for 'created_at'

und die letzten beiden Spalten meiner Tabelle sind created_atund updated_at.

Hier ist meine Tabellenstruktur:

Geben Sie hier die Bildbeschreibung ein

iamsujit
quelle
Was sind die Standardwerte für diese Spalten? Können Sie bitte die Tabellenstruktur teilen?
Priyanshu
@Priyanshu Ich habe meine Tabellenstruktur aktualisiert
iamsujit
2
Legen Sie den Standardwert current_timestamp für die letzten beiden Spalten fest.
Priyanshu

Antworten:

137

Das Problem liegt an sql_modes . Bitte überprüfen Sie Ihre aktuellen sql_modes mit dem Befehl:

show variables like 'sql_mode' ; 

Und entfernen Sie den sql_mode " NO_ZERO_IN_DATE, NO_ZERO_DATE ", damit es funktioniert. Dies ist der Standard-SQL-Modus in neuen MySQL-Versionen.

Sie können sql_mode global als root festlegen, indem Sie folgende Befehle ausführen:

set global sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Aman Aggarwal
quelle
7
Ich weiß das, aber in meinem Server sql_mode wird leer angezeigt. Funktioniert immer noch nicht. Ich verwende [Serverversion: 5.5.53-0ubuntu0.12.04.1 - (Ubuntu)]. Kann jemand eine Lösung haben, ohne die Serverversion zu aktualisieren?
Priyabrata Atha
Haben Sie mit einem globalen Befehl überprüft? und gibt es nichts in sql_mode für dieselbe Sitzung?
Aman Aggarwal
Ich habe show-Variablen wie 'sql_mode' überprüft. und die Ausgabe ist Variablenname | Wert = sql_mode |
Priyabrata Atha
2
Dies wird für diese Antwort nützlich sein stackoverflow.com/questions/2317650/…
Preshan Pradeepa
4
Hat bei mir mit 5.7 nicht funktioniert. Ich bin mir nicht sicher, ob ich es global tun musste oder nicht.
Brett
91

Bevor Sie Anweisungen ausführen, setzen Sie dies einfach in die erste Zeile:

SET sql_mode = '';
Ahmed Mohamed
quelle
das war einfach genial. Danke Kumpel!
Novasol
7
Danke für den Tipp. Das Entfernen von Datumsbeschränkungen NO_ZERO_IN_DATE,NO_ZERO_DATEermöglicht es uns jedoch nur, andere Sicherheitsfunktionen beizubehalten:SET sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
KeitelDOG
1
Zur Verdeutlichung sollte diese Aussage nur in der Entwicklung verwendet werden, nicht in der Produktion.
Ahmed Mohamed
25

Versuchen Sie, den folgenden Befehl auszuführen:

ALTER TABLE `investments` 
MODIFY created_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

und

ALTER TABLE `investments` 
MODIFY updated_at TIMESTAMP 
DEFAULT CURRENT_TIMESTAMP 
NOT NULL;

Der Grund, warum Sie diesen Fehler erhalten, ist, dass Sie keinen Standardwert für die Felder created_atund updated_atfestlegen. MySQL akzeptiert Ihren Befehl nicht, da die Werte für diese Spalten nicht null sein dürfen.

Hoffe das hilft.

Michele La Ferla
quelle
2
Vielen Dank, positiv bewertet, ich bevorzuge diese Lösung in meinem Anwendungsfall
ChrisR
25

Beim Versuch, eine Datenbank eines Drittanbieters zu installieren, ist derselbe Fehler aufgetreten. Ich habe die vorgeschlagene Lösung erfolglos ausprobiert, d. H.
SET sql_mode = '';

Dann habe ich den folgenden Befehl ausprobiert, mit dem die Datenbank installiert werden konnte
SET GLOBAL sql_mode = '';

Martin Mohan
quelle
1
SET sql_mode = '';ist jetzt veraltet, SET GLOBAL sql_mode = ''ist OK
Vadim Anisimov
5

In meinem Fall muss ich eine Datei importieren. Also habe ich einfach SET sql_mode = '' hinzugefügt; am Anfang der Datei und es funktioniert!

Tomás
quelle
5

Führen Sie diese Abfrage aus:

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

Für mich geht das

Nyenius
quelle
brauche übrigens nicht SET time_zone = "+00: 00";
Safak Ciplak
3

Sie können es so machen:

 CREATE TABLE `ttt` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `t1` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t2` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t3` TIMESTAMP  NULL DEFAULT '0000-00-00 00:00:00',
  `t4` TIMESTAMP  NULL DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;
  • Da der TIMESTAMP-Wert als Epochensekunden gespeichert ist, ist der Zeitstempelwert '1970-01-01 00:00:00' (UTC) reserviert, da die zweite # 0 für '0000-00-00 00:00:00' verwendet wird '.
  • In MariaDB 5.5 und früher konnte es nur eine TIMESTAMP-Spalte pro Tabelle geben, für die CURRENT_TIMESTAMP als Standardwert definiert war. Diese Grenze gilt seit MariaDB 10.0 nicht mehr.

siehe: https://mariadb.com/kb/en/mariadb/timestamp/

Stichprobe

MariaDB []> insert into ttt (id) VALUES (1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

MariaDB []> select * from ttt;
+----+---------------------+---------------------+---------------------+---------------------+
| id | t1                  | t2                  | t3                  | t4                  |
+----+---------------------+---------------------+---------------------+---------------------+
|  1 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  2 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
|  3 | 0000-00-00 00:00:00 | 2000-01-01 12:01:02 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+---------------------+---------------------+
3 rows in set (0.00 sec)

MariaDB []>
Bernd Buffen
quelle
3

Ich hatte ein ähnliches Problem. Folgendes hat es gelöst:

Veränderung:

recollect_date TIMESTAMP DEFAULT 'CURRENT_TIMESTAMP',

zu:

recollect_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,

dh entfernen Sie einfach die Anführungszeichen um CURRENT_TIMESTAMP .

Hoffe das hilft jemandem.

Bhushan
quelle
3

Wie in der Antwort von @Bernd Buffen erwähnt. Dies ist ein Problem mit MariaDB 5.5. Ich aktualisiere MariaDB 5.5 einfach auf MariaDB 10.1 und das Problem wurde behoben.

Hier Schritte zum Upgrade von MariaDB 5.5 auf MariaDB 10.1 unter CentOS 7 (64-Bit)

  1. Fügen Sie dem MariaDB-Repo die folgenden Zeilen hinzu.

    nano /etc/yum.repos.d/mariadb.repo und fügen Sie die folgenden Zeilen ein.

[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64
gpgkey = https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck = 1

  1. Stoppen Sie MariaDB, falls bereits ausgeführt service mariadb stop
  2. Update durchführen

    yum update

  3. Starten von MariaDB und Durchführen eines Upgrades

    service mariadb start

    mysql_upgrade

Alles getan.

Überprüfen Sie die MariaDB-Version: mysql -V


HINWEIS : Bitte sichern Sie immer die Datenbank (en), bevor Sie Upgrades durchführen. Daten können verloren gehen, wenn das Upgrade fehlgeschlagen ist oder ein Fehler aufgetreten ist.

Hassaan
quelle
3
SET GLOBAL sql_mode = '';

Mein Problem wurde behoben.

Ondi Gusho
quelle
1

Melden Sie sich für Mysql5.7 in der mysql-Befehlszeile an und führen Sie den Befehl mysql> show variables wie 'sql_mode' aus. Es wird angezeigt, dass NO_ZERO_IN_DATE, NO_ZERO_DATE im sql_mode.

Geben Sie hier die Bildbeschreibung ein

Versuchen Sie, eine Zeile unter [mysqld] in Ihre mysql conf-Datei einzufügen, um die beiden Optionen zu entfernen. Meine (mysql 5.7 unter Ubuntu 16) lautet /etc/mysql/mysql.conf.d/mysqld.cnf

Geben Sie hier die Bildbeschreibung ein

Starten Sie jetzt MySQL neu. Es klappt!

Malajisi
quelle
0

Für Mysql8.0.18:

CURRENT_TIMESTAMP([fsp])

Entfernen Sie "([fsp])", mein Problem wurde behoben.

imldp
quelle
0
  1. Überprüfen Sie zunächst, ob vorhandene Modi den folgenden Befehl in Ihrem Terminal verwenden:

    $ mysql -u root -p -e "SHOW VARIABLES LIKE 'sql_mode';"

    oder

    mysql> show variables like 'sql_mode';

    Sie würden eine Ausgabe wie unten sehen

    Geben Sie hier die Bildbeschreibung ein

  2. Modus (e) über my.cnf deaktivieren: In diesem Fall müssen Sie die Modi NO_ZERO_IN_DATE und NO_ZERO_DATE entfernen

    Öffnen Sie die Datei my.cnf (Im Allgemeinen finden Sie die Datei my.cnf in /etc/my.cnf oder /etc/mysql/my.cnf).

    Aktualisieren Sie die Modi in my.cnf unter der [mysqld]Überschrift

    sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

    Hier habe ich die Modi NO_ZERO_IN_DATE, NO_ZERO_DATE weggelassen

  3. Starten Sie den MySQL-Server neu

    $ /etc/init.d/mysql restart

Thushan
quelle