Come appare il messaggio
ERROR 1067 (42000): Invalid default value for 'created_at'Cause frequenti
- Una colonna
TIMESTAMPoDATETIMEha come default'0000-00-00 00:00:00'mentreNO_ZERO_DATEè attivo. - Il dump viene da MySQL 5.6 e usa default che 5.7/8.0 rifiutano con
STRICT_TRANS_TABLES. - Il default non corrisponde al tipo: testo su una colonna numerica, o un default su
TEXTprima di MySQL 8.0.13. - Charset o collation del default non corrispondono alla colonna, frequente nei dump vecchi.
- Una migrazione mette
CURRENT_TIMESTAMPsu una colonna che in questa versione non lo consente.
Verifica
- Mostra il sql_mode attivo
mysql -e "SELECT @@sql_mode;" - Controlla la definizione della colonna
mysqldump --no-data db table | grep -i -A3 -E 'timestamp|datetime' - Confronta versione di origine e destinazione
mysql --version; grep -i -m1 'server version' dump.sql
Soluzione
- Allinea il default al tipo:
DEFAULT CURRENT_TIMESTAMPinvece di una data zero, oppure permettiNULL. - Per un import allenta il modo solo per la sessione:
SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';– in modo consapevole e non permanente. - Meglio testare il dump sulla versione di destinazione e rigenerarlo con le opzioni giuste, invece di forzare il modo.
- Ricontrolla
sql_modedopo l'import, altrimenti entrano date zero senza accorgersene.
Domande frequenti
Perché compare solo dopo l'aggiornamento del server?
Perché STRICT_TRANS_TABLES e NO_ZERO_DATE sono attivi di default nelle versioni nuove.
Posso disattivare sql_mode in modo permanente?
Tecnicamente sì, ma il database salverebbe valori sbagliati in silenzio. Ha senso solo durante un import.