Question

My database had lots of views and it was impossible to drop them one by one.

I would like to just drop them all because the database doesn't refresh structure changes of the tables in the view that select from them.

Was it helpful?

Solution 2

After searching on the web, I found a shell script to drop all tables here: http://www.cyberciti.biz/faq/how-do-i-empty-mysql-database/

Then, I changed that script to drop all views of the database. This is the final result:

#!/bin/bash
PREFIX=""
SUFFIX=""
HOST="localhost"
PORT="3306"

while getopts p:s:h:P: OPCAO; do
    case "${OPCAO}" in
      p) PREFIX="${OPTARG}" ;;
      s) SUFFIX="${OPTARG}" ;;
      h) HOST="${OPTARG}" ;;
      P) PORT="${OPTARG}" ;;
    esac
done

shift $((OPTIND-1))

MUSER="$1"
MPASS="$2"
MDB="$3"

# Detect paths
MYSQL=$(which mysql)
AWK=$(which awk)
GREP=$(which grep)

if [ $# -eq 0 ]
then
    echo "Usage: $0 [-h Host] [-P Port] [-p Prefix-View-Name] [-s Suffix-View-Name] {MySQL-User-Name} {MySQL-User-Password} {MySQL-Database-Name}"
    echo "Drops all views from a MySQL"
    exit 1
fi

TABLES=$($MYSQL -h $HOST -P $PORT -u $MUSER -p$MPASS $MDB -e "SELECT table_name FROM information_schema.views WHERE table_schema = '$MDB' AND table_name LIKE '$PREFIX%$SUFFIX';" | $AWK '{ print $1}')

for t in $TABLES
do
    echo "Deleting $t view from $MDB database..."
    $MYSQL -h $HOST -P $PORT -u $MUSER -p$MPASS $MDB -e "drop view $t"
done

This solution will work just for who uses Unix-like systems.

To call the script, I used:

./script.sh [-h host] [-P port] [-p prefixViewName] [-s suffixViewName] username password databaseName

EDIT: I improved the script to accept option parameters, like the host, port and also a prefix and a suffix to filter what views will be dropped.

OTHER TIPS

If you want to do this in the MySQL client, you can dynamically generate the DDL statements using information_schema, dump them to a SQL script, and then execute that script.

Example:

select concat('drop view ',table_schema,'.',table_name,';') as ddl 
into outfile '/tmp/drop_all_views.sql' 
from information_schema.views 
where table_schema = 'your_schema';

\. /tmp/drop_all_views.sql
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top