Come eliminare tutte le tabelle in un database MySQL senza eliminare il database?


12

Devo eliminare tutte le tabelle in un database senza conoscerne prima i nomi. La procedura tipica è eliminare e quindi ricreare il database ma questa non è un'opzione. Qual'è il miglior modo di farlo?


1
Probabilmente avrei dovuto chiederlo in anticipo, ma meglio tardi che mai suppongo: quale sistema operativo?
Jeff Snider,

Unix / Linux come OS.
Angel Chiang

Risposte:


18

Esiste un semplice bash one-liner usando mysqldump (dal blog di Thingy Ma Jig ).

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

Se ricevi questo errore:

ERROR 1217 (23000) at line 1: Cannot delete or update a parent row: 
    a foreign key constraint fails

Prova quanto segue:

(echo 'SET foreign_key_checks = 0;'; 
 (mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | 
     grep ^DROP); 
 echo 'SET foreign_key_checks = 1;') | \
    mysql -u[USERNAME] -p[PASSWORD] -b [DATABASE]

Ora ignora i vincoli.


5

È necessario utilizzare le tabelle information_schema per recuperare i metadati sul database, quindi eliminare le tabelle elencate lì.


3

Puoi provare anche uno script di shell rapido per farlo:

#!/bin/bash

IFS=$'\n'
for table in `mysql <databaseName> -N -e 'show tables'`; do
    echo mysql <databaseName> -e "drop table $table"
done

Rimuovi echodopo aver verificato che farà ciò che ti aspetti.


A proposito, perché scrivi '$' prima del valore di IFS? Perché non sembra "IFS = '\ n'"?
Kolypto,

@o_OTync L'utilizzo $''fa sì che bash interpreti le sequenze rovesciate invece di prenderle alla lettera. '\n'conterrebbe esattamente \ n, proprio come quello, che $IFScomprenderebbe la divisione in \ e n caratteri. $'\n'conterrà un carattere di nuova riga, 0x0D. Dai un'occhiata qui per maggiori informazioni: gnu.org/software/bash/manual/bashref.html#ANSI_002dC-Quoting .
Jeff Snider,

Penso che sia più semplice dell'utilizzo di INFORMATION_SCHEMA.
Angel Chiang


-2

Se hai accesso al filesystem, allora rm -rf databasename/*:).

L'istruzione Drop database fa lo stesso ... Estratto dal manuale di MySQL:

L'istruzione DROP DATABASE rimuove dalla directory del database indicata i file e le directory che MySQL stesso può creare durante il normale funzionamento:


2
Un'idea estremamente negativa per qualsiasi installazione non banale poiché MySQL non si aspetta che questi file scompaiano improvvisamente e potrebbe essere nel mezzo di un numero qualsiasi di operazioni, transazioni, replica, blocchi ...
bot403

Considereresti di rivedere la tua risposta per includere i comandi e la procedura corretti?
bot403,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.