Comment supprimer toutes les tables mysql qui contiennent un motif

Posted on 2014-07-30 in Blog

Récemment, j'ai eu besoin de faire du ménage dans les tables d'une base de données. Toutes les tables à supprimer commençaient par le même motif. Malheureusement, mysql ne permet pas d'utiliser le jocker % dans une requête DROP.

Heureusement la solution est simple. Il suffit de lister toutes les tables ayant ce motif grâce à la requête SHOW TABLES LIKE 'motif%'. Reste à boucler sur ces tables pour les supprimer. D'où le code suivant :

motif=del_
for table in $(mysql database -NBe "SHOW TABLES LIKE '$motif%'"); do
  mysql database "DROP TABLE $table"
done

L'option -N de mysql masque les entêtes de colonnes et l'option -B permet d'avoir un résultat brut, exploitable dans la boucle.

On peut également faire le script plus générique suivant :

#!/usr/bin/bash

help="mysql_drop_table_like [options] database pattern

Drop all the mysql tables in database that starts with pattern.

-h: host
-u: user
-pPASSWD: give password
-P: prompt for password
"

usage() {
    echo -e $help
}

pflag=false
Pflag=false
uflag=false
hflag=false

while getopts ":h:u:p:P" opt
do
    case "$opt" in
        h)
            host=$OPTARG; hflag=true;;
        u)
            user=$OPTARG; uflag=true;;
        p)
            passwd=$OPTARG; pflag=true;;
        P)
            Pflag=true;;
        :)
            echo "Option -$OPTARG requires an argument." >&2
            usage; exit 1;;
        \?)
            usage; exit 0;;
    esac
done
shift $((OPTIND-1)) # To get the 1st positional argument with $1

# Check that we have at least 2 positional arguments
if [ $# -lt 2 ] ; then
    echo "Number of positional arguments insuffisant."
    usage
    exit 1
fi

# Cannot provide and ask for password
if $Pflag && $pflag; then
    echo "Cannot provide and ask for password."
    usage
    exit 1
fi

if $hflag; then
    HOST="-h $host"
fi
if $pflag; then
    PASSWD="-p$passwd"
fi
if $Pflag; then
    PASSWD="-p"
fi
if $uflag; then
    USER="-u $user"
fi

mysql="mysql $HOST $PASSWD $USER"
for table in $($mysql $1 -NBe "SHOW TABLES LIKE '$2%'"); do
    $mysql $1 -e "DROP TABLE $table"
done