質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

3回答

5221閲覧

【mysql】sqlでtableを全てdropしたい

katosei

総合スコア32

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/09/21 10:23

やりたい事

  • 不規則な名前で作られた複数のtableを
  • 毎回同じSQLで全て削除したい

条件

sqlのみで行う必要があります。
linuxコマンド等は挟めません。

sqlは複数に分けても大丈夫。
ただし都度sql文を作成はせず、コピペで行えるレベルで同じもの。

調べた事

ネット上には似たような疑問もありましたが、どれもlinuxコマンドを経由してやってました。

サブクエリ使えば出来るのかなーと思いましたが、「show tables」はサブクエリに使えない?
sqlにあまり詳しくないので申し訳ないです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

すべてのテーブルをテーブル定義ごと削除して良いということですよね?
であれば、drop database でデータベースごと削除しても良い気がしますが。。。

もし、「毎回」というのが、不規則でも毎回同じテーブルを削除するだけなら、drop table aaa, bbb, ccc, ddd, ... みたいな SQL を一度書いておいて、毎回コピペで実行することはできますね。

投稿2018/09/21 10:46

ssasaki

総合スコア1167

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2018/09/21 10:50

「不規則な名前」がネックですね。 information_schemaが使えると思います
katosei

2018/09/21 11:43

権限的にdrop databaseが使えない、というのが痛いです。 createの方も出来ないので。 なおDB名も毎回バラバラです。
guest

0

ベストアンサー

databaseを削除するのが手っ取り早いような気がしますが
procedureをつくってcallすればいいでしょう

まず、任意のDBに入り

SQL

1use 任意のdb
  • procedure作成

SQL

1drop procedure if exists droptables; 2delimiter // 3create procedure droptables() 4begin 5declare a varchar(255); 6declare done int default 0; 7declare cur cursor for 8select TABLE_NAME from `information_schema`.tables where table_schema=database() and table_type = 'BASE TABLE'; 9declare continue handler for sqlstate '02000' set done=1; 10open cur; 11repeat 12fetch cur into a; 13if not done then 14set @sql=CONCAT('DROP TABLE IF EXISTS ' , a ); 15prepare stmt from @sql; 16execute stmt; 17end if; 18until done end repeat; 19close cur; 20end 21// 22delimiter ; 23
  • 削除実行

SQL

1call droptables;

投稿2018/09/21 10:48

yambejp

総合スコア114572

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2018/09/21 10:52

> sqlにあまり詳しくないので申し訳ないです。 とのことなので、procedureの仕組み自体理解していないかもしれません。 とにかくコピペでテストしてみてください (消しちゃまずいデータベースでは絶対利用しないこと)
katosei

2018/09/21 11:56

ありがとうございます。 無事消すことが出来ました! 一応ストアドプロシージャーの概念だけは理解しているつもりです。 (何をやってるかはかなりおぼろげですが) 最初のdropの部分まで書いてくれた気遣いがありがたいです。 ぱぱっと数行で行けるのかと思ったら、思いの外大掛かりになってしまい、お手数おかけしました。 複数のDBにコピペで実行できる事が確認出来たので、要件としては完璧に満たして頂きました。
yambejp

2018/09/21 12:04

おお、柔軟な思考ができる方でよかったです わたしはprocedureを触った最初の頃は、理解できない息苦しさで 絶対自分の感性にあわないと、投げ出したものです。 (その後どうしても必要なので勉強してなんとかなりましたが) プロシージャ自体構文は煩雑で融通が効かないですが、やっていることは実は 大したことではないので、理解すればさほどハードルはたかくありません。 これを機会にプロシージャやファンクションの学習をしてみるとよいかもしれません。
Orlofsky

2018/09/21 20:19

repeat ~ until done end repeat; if ~ end if; の中をそれぞれ字下げすると、ちょっと理解し易くなるかと。
guest

0

「show tables」はサブクエリに使えない?

のではなくDROP TABLE文にはテーブル名を渡すしかなかったと思います。
https://dev.mysql.com/doc/refman/5.6/ja/drop-table.html

drop tableというキーワードでリファレンスを検索した結果がこちらです。
DROP TABLE構文はそれ以外の拡張的な構文は用意されていないと思われます。

以下余談

CREATE TABLEなら、CREATE TABLE...SELECTとかっていうのがあるんですけどね。

投稿2018/09/21 10:53

spookybird

総合スコア1803

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katosei

2018/09/21 11:57

あー、もう仕様として出来ないんですね。 わからないなりに試行錯誤してみてたんですが、ちゃんとドキュメントを見るべきでした。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問