Karena semua tabel adalah MyISAM, ini membuat jawaban saya lebih mudah untuk diungkapkan.
Pertama, Anda perlu meminta informasi kepada tabel yang memiliki nol baris: INFORMATION_SCHEMA:
SELECT table_schema,table_name FROM information_schema.tables
WHERE table_rows = 0 AND table_schema NOT IN
('information_schema','mysql','performance_schema');
Selanjutnya, rumuskan kueri untuk menjatuhkan tabel kosong:
SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name,';') DropTableCommand
FROM information_schema.tables
WHERE table_rows = 0 AND table_schema NOT IN
('information_schema','mysql','performance_schema');
Sekarang, buang perintah ke file teks SQL eksternal.
SQL="SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name,';') DropTableCommand"
SQL="${SQL} FROM information_schema.tables WHERE table_rows = 0 AND table_schema"
SQL="${SQL} NOT IN ('information_schema','mysql','performance_schema')"
mysql -uroot -p -ANe"${SQL}" > DropTables.sql
Lihatlah isinya dengan salah satu dari yang berikut ini
less DropTables.sql
cat DropTables.sql
Jika Anda puas dengan isinya, jalankan skrip:
mysql -uroot -p < DropTables.sql
atau masuk ke mysql dan jalankan seperti ini:
mysql> source DropTables.sql
Cobalah !!!
CAVEAT : Teknik ini hanya bekerja dengan tabel MyISAM karena jumlah baris dari tabel MyISAM secara fisik disimpan di .MYD
dalam tabel. Tabel metadata INFORMATION_SCHEMA.TABLES selalu membaca ini dan memperbarui. JANGAN MENCOBA DENGAN INNODB !!!
UPDATE 2014-02-05 11:46 EST
Ada alasan saya dikecualikan ('information_schema','mysql','performance_schema')
The mysql
Skema memiliki meja kosong di dalamnya. Beberapa MyISAM
, beberapa InnoDB
, beberapa CSV
.
Sebagai contoh, berikut adalah tabel saya di skema mysql untuk MySQL 5.6.15 di desktop saya
mysql> select table_name,engine,table_rows
-> from information_schema.tables
-> where table_schema='mysql';
+---------------------------+--------+------------+
| table_name | engine | table_rows |
+---------------------------+--------+------------+
| columns_priv | MyISAM | 0 |
| db | MyISAM | 2 |
| event | MyISAM | 0 |
| func | MyISAM | 0 |
| general_log | CSV | 2 |
| help_category | MyISAM | 40 |
| help_keyword | MyISAM | 485 |
| help_relation | MyISAM | 1090 |
| help_topic | MyISAM | 534 |
| innodb_index_stats | InnoDB | 0 |
| innodb_table_stats | InnoDB | 0 |
| ndb_binlog_index | MyISAM | 0 |
| plugin | MyISAM | 0 |
| proc | MyISAM | 0 |
| procs_priv | MyISAM | 0 |
| proxies_priv | MyISAM | 1 |
| servers | MyISAM | 0 |
| slave_master_info | InnoDB | 0 |
| slave_relay_log_info | InnoDB | 0 |
| slave_worker_info | InnoDB | 0 |
| slow_log | CSV | 2 |
| tables_priv | MyISAM | 0 |
| time_zone | MyISAM | 0 |
| time_zone_leap_second | MyISAM | 0 |
| time_zone_name | MyISAM | 0 |
| time_zone_transition | MyISAM | 0 |
| time_zone_transition_type | MyISAM | 0 |
| user | MyISAM | 6 |
+---------------------------+--------+------------+
28 rows in set (0.01 sec)
mysql>
Jika beberapa dari mereka tabel menghilang (seperti columns_priv
, proc_priv
, tables_priv
, dll), mekanisme hibah mungkin tidak bekerja dengan baik atau dapat menyebabkan mysqld tidak start up. Anda juga tidak ingin memukul mysql.proc karena ini adalah rumah fisik dari Stored Procedures. Mekanisme lain mungkin tidak berfungsi jika Anda ingin menggunakannya, seperti Replikasi CrashSafe menggunakan tabel InnoDB di dalam skema mysql, atau jika Anda ingin memasukkan informasi zona waktu.
UPDATE 2014-02-05 12:36 EST
Saya ingin memuji Tom Desp atas jawabannya karena alasan tertentu: Sintaksnya dapat melakukan drop tanpa menggunakan skrip eksternal . Menggunakan idenya, izinkan saya menangkap perintah DROP TABLE ke dalam variabel yang ditentukan pengguna.
SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(DBTB),';')
INTO @DropCommand
FROM (SELECT CONCAT(table_schema,'.',table_name) DBTB
FROM information_schema.tables
WHERE table_rows = 0 AND table_schema NOT IN
('information_schema','mysql','performance_schema')) A;
SELECT @DropCommand;
Jika output dari SELECT @DropCommand;
sudah benar, maka jalankan perintah seperti ini:
PREPARE s FROM @DropCommand;
EXECUTE s;
DEALLOCATE PREPARE s;
Ini menghilangkan dua hal:
- perlunya file teks SQL eksternal
- menjalankan perintah DROP TABLE terpisah untuk setiap tabel