516

そこにある可能性のある外部キー制約を無視して、MySQLデータベースからすべてのテーブルを削除する簡単な方法はありますか?

4

26 に答える 26

646

生成されたdropステートメントのセットが役立つことがわかり、次の調整をお勧めします。

  1. 生成されたドロップを次のようにデータベースに制限します。
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`手動で修正する必要があります。

  1. http://dev.mysql.com/doc/refman/5.5/en/drop-table.htmlによると、カスケードを使用したドロップは無意味/誤解を招く可能性があることに注意してください。

「RESTRICTとCASCADEは、移植を容易にすることを許可されています。MySQL5.5では、何もしません。」

したがって、必要に応じてdropステートメントを機能させるには、次のようにします。

SET FOREIGN_KEY_CHECKS = 0

これにより、参照整合性チェックが無効になります。したがって、必要なドロップの実行が完了したら、次のコマンドでキーチェックをリセットする必要があります。

SET FOREIGN_KEY_CHECKS = 1
  1. 最終的な実行は次のようになります。
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

注意:SELECTの出力をより簡単に使用するには、mysql-Bオプションが役立ちます。

于 2011-11-23T19:54:08.493 に答える
153

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;

(これは、テーブルを任意の順序でドロップできるようにするために外部キーチェックを無効にする方法に答えます。既存のすべてのテーブルのドロップテーブルステートメントを自動的に生成して単一のスクリプトで実行する方法には答えません。Jeanの答えします。)

于 2010-08-13T12:33:30.640 に答える
117

外部キーが無視されるように変更された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`;
于 2012-10-16T15:09:29.180 に答える
61

上記のすべてのアプローチには、この1つの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
于 2016-01-15T19:59:47.977 に答える
35

この答えから、

実行する:

  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


それ以外の場合、Dionの受け入れられた答えは、最初にクエリを取得するために、次にクエリを実行するために2回実行する必要があることを除いて、より単純です。db名とテーブル名の特殊文字をエスケープするために、いくつかのばかげたバックティックを提供しました。

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here
于 2014-02-12T22:36:31.143 に答える
19

これがカーソルベースのソリューションです。ちょっと長いですが、単一の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`;
于 2012-04-15T07:00:24.570 に答える
12

できるよ:

select concat('drop table if exists ', table_name, ' cascade;')
  from information_schema.tables;

次に、生成されたクエリを実行します。現在のデータベースのすべてのテーブルを削除します。

これがコマンドに関するヘルプdrop tableです。

于 2010-08-13T12:33:40.793 に答える
11

特定のデータベースからすべてのテーブルを削除するための1つのライナー:

echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"

これを実行すると、データベースDATABASE_NAMEからすべてのテーブルが削除されます。

そして、これの良いところは、データベース名が明示的に1回だけ書き込まれることです。

于 2016-08-07T13:07:52.287 に答える
9

多くのテーブルで簡単にできるように、DionTruterの回答にこの変更を加えました。

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必要に応じて)。

于 2013-07-24T01:18:34.103 に答える
9

トピックをグーグルで検索すると、常にこの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`;
于 2018-01-15T12:29:25.730 に答える
9

プロシージャを使用してSQLSelectクエリから戻り値をコピーしないワンステップソリューション。

SET FOREIGN_KEY_CHECKS = 0;
SET SESSION group_concat_max_len = 1000000;

SET @TABLES = NULL;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name,'`') INTO @TABLES FROM information_schema.tables 
  WHERE table_schema = 'databaseName';

SET @TABLES = CONCAT('DROP TABLE IF EXISTS ', @TABLES);

PREPARE stmt FROM @TABLES;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET SESSION group_concat_max_len = 1024;
SET FOREIGN_KEY_CHECKS = 1
于 2020-09-20T20:00:45.733 に答える
7

これを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
于 2013-04-09T20:33:09.960 に答える
6

Linux(または配管、echo、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;

これは古い質問ですが、この方法は速くて簡単だと思います。

于 2014-11-11T18:17:48.280 に答える
4

コマンドラインから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]は、実際のデータ(ユーザー、パスワード、ホスト名、データベース名)に置き換える必要があります。

于 2020-02-04T17:15:24.653 に答える
2

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をデータベースの名前、そして明らかにユーザー/パスに変更することを忘れないでください。

于 2013-08-21T13:38:26.947 に答える
2

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が望んでいた仕事を実際に行うために、コピーして貼り付けることができるワンライナー(ish)が欲しかっただけです。

もちろん、セキュリティ設定が非常に低い場合を除いて、これらのmysqlコマンドにもクレデンシャルを(2回)入力する必要があることに注意してください。(または、mysqlコマンドのエイリアスを作成してcredsを含めることもできます。)

于 2014-06-13T08:21:57.807 に答える
2

ここに、すべてのテーブルを削除するためのJonathanWattによる有用なコメントを入力してください。

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

それは私を助け、私はそれが役立つことを願っています

于 2018-06-24T11:14:11.237 に答える
1

これはかなり古い投稿ですが、ここでの回答はどれも私の意見では実際に質問に答えていなかったので、私の投稿が人々に役立つことを願っています!

私はこの解決策を私にとって本当にうまくいく別の質問で見つけました:

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

お役に立てれば!

于 2015-08-20T14:07:59.673 に答える
1

@DionTruterと@WadeWilliamsの回答に基づいて、次のシェルスクリプトは、実行しようとしているものを最初に表示し、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}
于 2017-03-07T02:05:00.447 に答える
1

ちょっとしたリマインダー、

可能で、他に問題がない場合は、データベースを削除して再作成できます。

  • データベース<database_name>を削除します
  • データベースの作成<database_name>
于 2022-03-01T08:10:46.953 に答える
0

このソリューションは@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
于 2018-04-04T15:15:16.187 に答える
0
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"
于 2018-09-14T09:28:36.350 に答える
0

シンプルで明確(そうかもしれません)。

派手な解決策ではないかもしれませんが、これは私を助け、私の一日を救いました。

サーバーバージョンで動作: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> 

ここに画像の説明を入力してください

于 2019-03-05T17:09:12.303 に答える
0

すべてが良い答えを出しました、しかし、私はスプレッドシート/エクセルシートに精通しているユーザーのための代替オプションを持っています。最初の解決策に従って、コマンドのリストを取得しますが、それでも最初と最後の文字を切り捨てる必要があります('|')

  1. " show tables;"クエリを使用すると、すべてのテーブルのリストが取得されます。

  2. 結果をコピーしてExcelシートに貼り付けます(すべてのレコードがExcelの列「A」にあると仮定します)

  3. 最初に、最初と最後の'|'を削除する必要があります symbol-最初の文字を削除する関数。'|'

    = RIGHT(A1、LEN(A1)-1)

最後の文字を削除する関数、すなわち。'|' 終了セミコロンを追加します

=CONCAT(LEFT(B1,LEN(B1)-1),";")
  1. 次に、CONCAT関数を使用して最終的なクエリリストを作成します

    = CONCAT( "ドロップテーブル"、C1)

于 2022-02-03T19:10:33.590 に答える
-1

私は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ステートメント全体を削除します(追加された安全性が気に入っています)。

于 2015-02-23T09:05:56.953 に答える
-7

これまでのところ私にとって最良の解決策

[データベース]->[右クリック]->[タスク]->[スクリプトの生成]を選択すると、スクリプトを生成するためのウィザードが開きます。スクリプトオプションの設定でオブジェクトを選択した後、[詳細ボタン]をクリックします。[スクリプトの削除と作成]で、[スクリプトの削除]選択します。

スクリプトを実行します。

于 2016-03-17T14:08:43.207 に答える