MySQLデータベースからすべてのテーブルを削除して、そこにある可能性のある外部キー制約を無視する簡単な方法はありますか?
Drop
、ドロップダウンメニューから選択した場合、チェックForeign key check
ボックスをオフにすることができます。
MySQLデータベースからすべてのテーブルを削除して、そこにある可能性のある外部キー制約を無視する簡単な方法はありますか?
Drop
、ドロップダウンメニューから選択した場合、チェックForeign key check
ボックスをオフにすることができます。
回答:
生成された一連のドロップステートメントが有用であることがわかったので、以下の調整をお勧めします。
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';
注1:これはDROPステートメントを実行するのではなく、それらのリストを表示するだけです。実行するには、出力をSQLエンジンにカットアンドペーストする必要があります。
注2:VIEWがある場合は、各DROP TABLE `VIEW_NAME`
ステートメントをDROP VIEW `VIEW_NAME`
手動で修正する必要があります。
「RESTRICTとCASCADEは移植を容易にするために許可されています。MySQL5.5では何もしません。」
したがって、必要に応じてdropステートメントを機能させるには、次のようにします。
SET FOREIGN_KEY_CHECKS = 0
これにより、参照整合性チェックが無効になります。したがって、必要なドロップの実行が完了したら、次のコマンドでキーチェックをリセットする必要があります。
SET FOREIGN_KEY_CHECKS = 1
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;
注意:SELECTの出力をより簡単に使用するには、mysql -Bオプションが役立ちます。
DROP DATABASE foo; CREATE DATABASE foo;
と同じではありませんが、うまくいきました。
http://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keysから:
SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;
(これは、テーブルを任意の順序でドロップできるようにするために、外部キーチェックを無効にする方法に答えるものです。既存のすべてのテーブルのドロップテーブルステートメントを自動的に生成し、単一のスクリプトで実行する方法には答えません。ジーンの答えします。)
以下は、外部キーが無視されるように変更されたSurlyDreのストアドプロシージャです。
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
SET FOREIGN_KEY_CHECKS = 0;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
PREPARE stmt1 FROM @stmt_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
_tableName
、逆引用符でラップする必要があると思います。そうしないと、group
や他のキーワードなどの一部のテーブルで失敗します。
上記のすべてのアプローチには、このAFAICTよりもはるかに多くの作業が含まれています...
( mysqldump --add-drop-table --no-data -u root -p database | grep 'DROP TABLE' ) > ./drop_all_tables.sql
mysql -u root -p database < ./drop_all_tables.sql
mysqldump
にmysql
、単ににパイプしないのはなぜですか?
mysqldump
しgrep
ましたmysql
、それは動作します。解決策をありがとう、それは良いことです。
この答えから、
実行:
use `dbName`; --your db name here
SET FOREIGN_KEY_CHECKS = 0;
SET @tables = NULL;
SET GROUP_CONCAT_MAX_LEN=32768;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables
FROM information_schema.tables
WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables, '') INTO @tables;
SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
これにより、現在使用中のデータベースからテーブルが削除されます。を使用して、現在のデータベースを設定できますuse
。
それ以外の場合は、最初にクエリを取得するために2回実行し、次にクエリを実行するために2回実行する必要があることを除いて、Dionが受け入れた回答はより単純です。データベース名とテーブル名の特殊文字をエスケープするために、愚かなバックティックをいくつか提供しました。
SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'dbName'; --your db name here
これがカーソルベースのソリューションです。ちょっと長いですが、単一のSQLバッチとして機能します:
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
PREPARE stmt1 FROM @stmt_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
できるよ:
select concat('drop table if exists ', table_name, ' cascade;')
from information_schema.tables;
次に、生成されたクエリを実行します。現在のデータベースのすべてのテーブルを削除します。
ここにいくつかのdrop table
コマンドのヘルプがあります。
||
が連結演算子として設定されていることを前提としています。より具体的には、MySQL SQLモードにはが含まれますPIPES_AS_CONCAT
。参考:dev.mysql.com/doc/refman/5.0/en/...
concat
代わりに使用するコードサンプルを修正しました||
多くのテーブルで簡単にするために、Dion Truterの回答にこの変更を加えました。
SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n',
GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
SEPARATOR ';\n'),
';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';
これにより1つのフィールドにすべてが返されるので、一度コピーしてすべてのテーブルを削除できます(Copy Field Content (unquoted)
Workbenchで使用)。テーブルがたくさんある場合、の制限に達する可能性がありますGROUP_CONCAT()
。その場合は、max len変数を増やします(max_allowed_packet
必要に応じて、)。
特定のデータベースからすべてのテーブルを削除するためのワンライナー:
echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"
これを実行すると、データベースDATABASE_NAMEからすべてのテーブルが削除されます。
また、これについての良い点は、データベース名が明示的に一度だけ書き込まれることです。
トピックをグーグルで検索すると、常にこのSOの質問が表示されるので、テーブルとビューの両方を削除するmysqlコードを使用します。
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
SET FOREIGN_KEY_CHECKS = 0;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql1 = CONCAT('DROP TABLE IF EXISTS ', _tableName);
SET @stmt_sql2 = CONCAT('DROP VIEW IF EXISTS ', _tableName);
PREPARE stmt1 FROM @stmt_sql1;
PREPARE stmt2 FROM @stmt_sql2;
EXECUTE stmt1;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt1;
DEALLOCATE PREPARE stmt2;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
これは、bashスクリプトを使用してこれを自動化する方法です。
host=$1
dbName=$2
user=$3
password=$4
if [ -z "$1" ]
then
host="localhost"
fi
# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done
Linux(またはパイピング、エコー、grepをサポートするその他のシステム)の場合は、1行で実行できます。
echo "SET FOREIGN_KEY_CHECKS = 0;" > temp.txt; \
mysqldump -u[USER] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP >> temp.txt; \
echo "SET FOREIGN_KEY_CHECKS = 1;" >> temp.txt; \
mysql -u[USER] -p[PASSWORD] [DATABASE] < temp.txt;
これは古い質問であることは知っていますが、この方法は高速でシンプルだと思います。
PHPでは、次のように簡単です。
$pdo = new PDO('mysql:dbname=YOURDB', 'root', 'root');
$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');
$query = "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = 'YOURDB'";
foreach($pdo->query($query) as $row) {
$pdo->exec($row[0]);
}
$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');
YOURDBをデータベースの名前に変更することを忘れないでください。明らかにユーザー/パスです。
bash / zshのようなLinuxシェルでは:
DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
"SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
} | mysql "$DATABASE_TO_EMPTY"
これはコマンドを生成し、すぐにそれらをテーブルを削除する2番目のクライアントインスタンスにパイプします。
もちろん、ここでは他の回答から巧妙な部分をコピーしています。実際にコピーして貼り付け可能なワンライナー(よう)を作成したかっただけです。、OPが望む仕事することを望んでいました。
注もちろん、あなたが非常に低いセキュリティを設定している場合を除き、あまりにも、これらのmysqlコマンドで(2回)で資格情報を配置する必要があります。(または、mysqlコマンドにエイリアスを設定して、クレデンシャルを含めることができます。)
すべてのテーブルを削除するために、Jonathan Wattによって作成された便利なコメントをここに入力してください
MYSQL="mysql -h HOST -u USERNAME -pPASSWORD DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL
それは私を助け、私はそれが役に立つことを願っています
コマンドラインから1行で、データベースからすべてのテーブルを削除します。
mysqldump -u [user_name] -p[password] -h [host_name] --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [user_name] -p[password] -h [host_name] [database_name]
[user_name]、[password]、[host_name]および[database_name]は、実際のデータ(ユーザー、パスワード、ホスト名、データベース名)に置き換える必要があります。
これはかなり古い投稿ですが、ここでの回答はどれも私の意見では実際に質問に答えたものではないので、私の投稿が人々の役に立つことを願っています!
私はこの解決策を私にとって本当にうまくいく別の質問で見つけました:
mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done
これにより、データベース内のすべてのテーブルが実際に空DB_NAME
になり、TRUNCATE
コマンドラインが。
お役に立てれば!
次のシェルスクリプトは、@ Dion Truterと@Wade Williamsの回答に基づいて、最初に何を実行するかを示し、Ctrl-Cを使用して中止する機会を与えた後、すべてのテーブルを削除します。
#!/bin/bash
DB_HOST=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx
DB_NAME=xxx
CMD="mysql -sN -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME}"
# Generate the drop statements
TMPFILE=/tmp/drop-${RANDOM}.sql
echo 'SET FOREIGN_KEY_CHECKS = 0;' > ${TMPFILE}
${CMD} $@ >> ${TMPFILE} << ENDD
SELECT concat('DROP TABLE IF EXISTS \`', table_name, '\`;')
FROM information_schema.tables
WHERE table_schema = '${DB_NAME}';
ENDD
echo 'SET FOREIGN_KEY_CHECKS = 1;' >> ${TMPFILE}
# Warn what we are about to do
echo
cat ${TMPFILE}
echo
echo "Press ENTER to proceed (or Ctrl-C to abort)."
read
# Run the SQL
echo "Dropping tables..."
${CMD} $@ < ${TMPFILE}
echo "Exit status is ${?}."
rm ${TMPFILE}
このソリューションは@SkyLeachの回答に基づいていますが、外部キーを持つテーブルの削除をサポートしています。
echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql
DB="your database name" \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=0" \
&& mysqldump --add-drop-table --no-data $DB | grep 'DROP TABLE' | grep -Ev "^$" | mysql $DB \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=1"
シンプルで明確(多分)。
派手な解決策ではないかもしれませんが、これは私に役立ち、私の一日を救いました。
サーバーバージョンで動作:5.6.38 MySQL Community Server(GPL)
私が従った手順:
1. generate drop query using concat and group_concat.
2. use database
3. disable key constraint check
4. copy the query generated from step 1
5. enable key constraint check
6. run show table
MySQLシェル
mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0; Query OK, 0 rows affected (0.00 sec)
// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)
mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW tables;
Empty set (0.01 sec)
mysql>
MSSQLサーバーで以下を使用します。
if (DB_NAME() = 'YOUR_DATABASE')
begin
while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
declare @sql nvarchar(2000)
SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
exec (@sql)
PRINT @sql
end
while(exists(select 1 from INFORMATION_SCHEMA.TABLES))
begin
declare @sql2 nvarchar(2000)
SELECT TOP 1 @sql2=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
FROM INFORMATION_SCHEMA.TABLES
exec (@sql2)
PRINT @sql2
end
end
else
print('Only run this script on the development server!!!!')
YOUR_DATABASEをデータベースの名前に置き換えるか、IFステートメント全体を削除します(追加された安全が好きです)。
最適なソリューションこれまでのところ、私にとって
[ データベース]-> [右クリック]-> [タスク]-> [スクリプトの生成]を選択すると、スクリプトを生成するためのウィザードが開きます。[スクリプトの設定]オプションでオブジェクトを選択した後、[ 詳細ボタン ]をクリックします。下の「スクリプトDROPとCREATE」を選択スクリプトDROPを。
スクリプトを実行します。