Comment supprimer toutes les tables mysql qui contiennent un motif

Wed 30 July 2014

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

Pages

blogroll

social