MySQL: migrace nulových datumů
18. 3. 2022Při migraci dat ze starších verzí MySQL serveru na verzi 5.7 a novější se možná setkáte s chybou nepovolené hodnoty “0000-00-00” v datovém typu date. Problém vzniká rozdílnou konfigurací striktního režimu a režimu NO_ZERO_DATE.
Řešení 1
Změnit konfiguraci MySQL serveru aby umožnil zápis “0000-00-00” viz. officiální dokumetace https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date
Řešení 2
Migrovat datum “0000-00-00” na hodnotu null. Tento způsob řešení ne-vyžaduje změny konfigurace serveru, obcházení striktního módu a zároveň použití hodnoty null může dávat v kódu větší smysl. Je ale nezbytné nastavit ve schématu že sloupec s datem může být nulový.
INSERT INTO `table1`
(`id`, `date`)
SELECT
`id`, IF(CAST(`old_date` AS CHAR(10)) = '0000-00-00', null, `old_date`)
FROM `table2`
V SQL dotazu provádíme insert do nové tabulky ze staré kdy při výběru kontrolujeme “nulový” datum a případně ho nahradíme za hodnotu null. Funkce CAST slouží k převodu datového typu sloupce na znaky, aby nedošlo při čtení hodnot k chybě neplatné hodnoty “0000-00-00” v původním sloupci.