3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

みなさんデータベース操作をするためのSQLをDBMSにはいて操作したことはありますか?
データベース開発やメンテナンスの際,現在のデータベース内のすべてのテーブルを一括で削除する必要が生じることがあるよね?

こんなことにならないように普段から慎重に開発しましょう.テストやリセットの際は仕方がないですが

本記事では,そのための安全で効率的なSQLスクリプトを詳細に解説します.

SQLわかんない人は以下のSQLチートシートをご覧ください.

全部消すSQLはこれだ

MySQLで実行できるSQLを先にはっちゃいます.これを実行すると全部のデータが消えますわ.

ガチで全テーブルが消えちゃうので注意

SET FOREIGN_KEY_CHECKS = 0;
SET GROUP_CONCAT_MAX_LEN=32768;

SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables 
FROM information_schema.tables 
WHERE table_schema = DATABASE();

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

PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1;

外部キー制約の一時無効化

まず,外部キー制約を無効化する処理である。SET FOREIGN_KEY_CHECKS = 0;により,テーブル間の参照関係に影響を与えることなく,テーブルを安全に削除できる.

グループ連結の最大長設定

GROUP_CONCAT関数で生成される文字列の最大長を設定するステップである。デフォルト値では不十分な場合があるため,SET GROUP_CONCAT_MAX_LEN=32768;として32768バイトに拡張している.

現在のデータベース内のテーブル名を取得

information_schema.tablesから現在のデータベースに存在するすべてのテーブル名を取得する処理である.SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables FROM information_schema.tables WHERE table_schema = DATABASE();により,各テーブル名は「スキーマ名.テーブル名」の形式で連結される.

動的なDROP TABLE文の準備と実行

取得したテーブル名を使用して,動的なDROP TABLE IF EXISTS文を生成する。SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);PREPARE stmt FROM @tables;EXECUTE stmt;DEALLOCATE PREPARE stmt;を使用することで,柔軟で安全なテーブル削除を実現する.

外部キー制約の再有効化

最後に,SET FOREIGN_KEY_CHECKS = 1;により,外部キー制約を再度有効化する.

このスクリプトは,MySQL環境において,データベース内のすべてのテーブルを効率的かつ安全に削除するための汎用的な方法です.開発初期でテーブルをいじりたい,テスト,リセットなどのシーンで有用なツールとなるのでぜひ活用して欲しい.

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?