私のデータベースにはたくさんのビューがあり、それらを 1 つずつ削除することは不可能でした。
データベースは、それらから選択したビュー内のテーブルの構造の変更を更新しないため、それらをすべて削除したいと思います。
これを MySQL クライアントで行う場合は、information_schema を使用して DDL ステートメントを動的に生成し、それらを SQL スクリプトにダンプしてから、そのスクリプトを実行できます。
例:
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
Web で検索したところ、すべてのテーブルを削除するシェル スクリプトが見つかりました: http://www.cyberciti.biz/faq/how-do-i-empty-mysql-database/
次に、そのスクリプトを変更して、データベースのすべてのビューを削除しました。これが最終結果です。
#!/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
このソリューションは、Unix ライクなシステムを使用しているユーザーにのみ有効です。
スクリプトを呼び出すには、次を使用しました。
./script.sh [-h host] [-P port] [-p prefixViewName] [-s suffixViewName] username password databaseName
編集:ホスト、ポート、およびプレフィックスとサフィックスなどのオプションパラメーターを受け入れるようにスクリプトを改善し、どのビューを削除するかをフィルター処理しました。