Un semplice script per l'eliminazione di tutte le tabelle di un DB MySQL
Ieri mi sono trovato nella situazione di dover ricreare un database poiché le tabelle e i dati contenuti erano cambiati.
Creare tutti gli ALTER
e UPDATE
del caso era fuori discussione poiché si trattava di circa 2 milioni di record e non avevo tutti gli elementi per poter procedere.
La soluzione più facile è quella di importare un dump o uno script che effettua il DROP
del database e la successiva creazione from scratch (perchè dirlo così suona più figo).
Il problema? Non avevo i permessi per poter ricreare il database.
L’unica soluzione rimanente consiste nell’eliminare tutte le tabelle contenute nel database. Facile, no? NO! Qualcuno si ricorda dei vincoli di integrità referenziale? Bè io si… Almeno dopo che ho lanciato il mio script ;-)
Il problema è che se sono definiti dei vincoli di integrità referenziale su una tabella e non sono definiti degli ON DELETE CASCADE
, non è possibile eliminala. In soldoni se avete una relazione 1 a N tra la tabella A e la tabella B, non potete eliminare A se non eliminate prima B (per approfondire ecco un video).
L’approccio più stupido per ovviare al problema è rilanciare la vostra sfilza di DROP TABLE
finchè non avete più errori e di conseguenza avrete svuotato completamente il database. Ma ci sarà pure una soluzione più elegante!
Spulciando la documentazione e facendo un po’ di sano DuckDuckGaggio, ho scoperto come disabilitare i check sui vincoli di integrità tramite il comando SET foreign_key_checks = 0;
.
Fortunatamente un’anima pia ha anche messo assieme un bello snippet pronto all’uso da lanciare con Bash che trovate su GitHub:
L’unica cosa che manca allo script è il passaggio dell’host (nel caso l’istanza del DB non sia locale), ma è una cosa che si può facilmente aggiungere.
Se lo script vi è tornato utile non dimenticatevi di lasciare una star o un commento su GitHub al suo creatore!