みなさんデータベース操作をするための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環境において,データベース内のすべてのテーブルを効率的かつ安全に削除するための汎用的な方法です.開発初期でテーブルをいじりたい,テスト,リセットなどのシーンで有用なツールとなるのでぜひ活用して欲しい.