So sieht die Meldung aus
ERROR 1067 (42000): Invalid default value for 'created_at'Häufige Ursachen
- Ein
TIMESTAMP- oderDATETIME-Feld bekommt'0000-00-00 00:00:00'als Default, aberNO_ZERO_DATEist aktiv. - Der Dump stammt aus MySQL 5.6 und nutzt Defaults, die unter 5.7/8.0 mit
STRICT_TRANS_TABLESnicht mehr erlaubt sind. - Der Default passt nicht zum Typ, etwa ein Textwert auf einer Zahlenspalte oder ein Default auf
TEXTvor MySQL 8.0.13. - Zeichensatz oder Kollation des Defaults passen nicht zur Spalte, häufig bei alten Dumps.
- Die Migration setzt
CURRENT_TIMESTAMPauf eine Spalte, die das in dieser Version nicht darf.
Prüfen
- Aktiven sql_mode ansehen
mysql -e "SELECT @@sql_mode;" - Die Spalte im CREATE TABLE prüfen
mysqldump --no-data db table | grep -i -A3 -E 'timestamp|datetime' - Version von Quelle und Ziel vergleichen
mysql --version; grep -i -m1 'server version' dump.sql
Lösung
- Den Default an den Typ anpassen:
DEFAULT CURRENT_TIMESTAMPstatt Null-Datum, oder die Spalte darfNULLsein. - Beim Import den Modus nur für die Session lockern:
SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';– bewusst und nicht dauerhaft. - Besser den Dump auf der Zielversion testen und mit passenden Optionen neu erzeugen, statt den Modus zu verbiegen.
- Nach dem Import den
sql_modewieder prüfen, sonst landen stillschweigend Null-Daten in der Tabelle.
Häufige Fragen
Warum fällt das erst nach dem Serverupgrade auf?
Weil STRICT_TRANS_TABLES und NO_ZERO_DATE in neueren Versionen standardmäßig aktiv sind.
Kann ich den sql_mode dauerhaft abschalten?
Technisch ja, aber dann schreibt die Datenbank stillschweigend falsche Werte. Nur temporär beim Import sinnvoll.