SQL: menghapus tabel dengan awalan

101

Bagaimana cara menghapus tabel saya yang semuanya memiliki awalan myprefix_?

Catatan: perlu menjalankannya di phpMyAdmin

Deniz Zoeteman
sumber

Jawaban:

178

Anda tidak dapat melakukannya hanya dengan satu perintah MySQL, namun Anda dapat menggunakan MySQL untuk membuat pernyataan untuk Anda:

Di shell MySQL atau melalui PHPMyAdmin, gunakan kueri berikut

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

Ini akan menghasilkan pernyataan DROP yang dapat Anda salin dan jalankan untuk menjatuhkan tabel.

EDIT: Penafian di sini - pernyataan yang dihasilkan di atas akan menjatuhkan semua tabel di semua database dengan awalan itu. Jika Anda ingin membatasinya ke database tertentu, ubah kueri agar terlihat seperti ini dan ganti database_name dengan database_name Anda sendiri:

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';
Andre Miller
sumber
Saya hanya memiliki satu database jadi saya tidak memerlukan yang kedua.
Deniz Zoeteman
4
@ElijahLynn sumber batas mungkin karena panjang maksimum GROUP_CONCAT. Anda dapat memperbesarnya, lihat misalnya di sini
Asaf David
7
Catatan untuk diri sendiri. Tambah jumlah karakter maks: SET SESI group_concat_max_len = 999999999;
Mohammed Joraid
2
Harap dicatat bahwa, dalam beberapa kasus, perlu untuk menghindari garis bawah dalam nama awalan tabel[...] LIKE 'myprefix\_%';
Magictallguy
1
Ini mengembalikan banyak nama_tabel duplikat. Jawaban yang diposting Pankaj Khurana bekerja lebih baik IMHO.
Jeremy
37

Beberapa jawaban sebelumnya sangat bagus. Saya telah mengumpulkan ide-ide mereka dengan beberapa gagasan dari jawaban lain di web.

Saya perlu menghapus semua tabel yang dimulai dengan 'temp_' Setelah beberapa iterasi, saya menemukan blok kode ini:

-- Set up variable to delete ALL tables starting with 'temp_'
SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
               FROM information_schema.TABLES
              WHERE TABLE_SCHEMA = 'my_database'
                AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

Saya harap ini berguna untuk programmer MySQL / PHP lainnya.

Bradley Slavik
sumber
1
Ini jawaban yang benar-benar tepat. Jawaban lain menggunakan beberapa langkah atau mengharuskannya dilakukan secara manual. Tidak tahu bagaimana jawaban ini tidak memiliki lebih banyak suara setelah 4 tahun!
gbe
25
show tables like 'prefix_%';

salin hasilnya dan tempelkan ke editor teks atau keluarkan kueri ke file, gunakan beberapa pencarian dan ganti untuk menghapus pemformatan yang tidak diinginkan dan ganti \ndengan koma, letakkan a ;di akhir dan tambahkan tabel drop di depan.

Anda akan mendapatkan sesuatu yang terlihat seperti ini:

drop table myprefix_1, myprefix_2, myprefix_3;
Daniel
sumber
1
tidak memiliki akses ke information_schema.tables di webhost yang saya gunakan, jadi ini caranya terima kasih!
Florent Roques
10

Solusi @ andre-miller bagus tetapi ada yang lebih baik dan sedikit lebih profesional yang akan membantu Anda mengeksekusi semuanya sekaligus. Masih membutuhkan lebih dari satu perintah tetapi solusi ini akan memungkinkan Anda menggunakan SQL untuk pembuatan otomatis.

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES
    WHERE TABLE_NAME LIKE 'myprefix_%');
PREPARE stmt FROM 'DROP TABLE @tbls';
EXECUTE stmt USING @tbls;
DEALLOCATE PREPARE stmt;

Catatan: kode ini bergantung pada platform, ini untuk MySQL tetapi yang pasti dapat diterapkan untuk Postgre, Oracle dan MS SQL dengan sedikit perubahan.

Alex Rashkov
sumber
ERROR 1064 (42000): Anda mengalami kesalahan dalam sintaks SQL; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat '@tbls' pada baris 1 ERROR 1243 (HY000): Penangan pernyataan siap yang tidak diketahui (stmt) diberikan ke EXECUTE ERROR 1243 (HY000): Penangan pernyataan yang disiapkan tidak diketahui (staf) diberikan kepada DEALLOCATE SIAPKAN
Roni Tovi
Galat sintaks pada: PREPARE stmt FROM 'DROP TABLE @tbls';
ledawg
5
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";
Pankaj Khurana
sumber
3

Saya berhasil menjatuhkan tabel dengan edit kueri menjadi seperti ini

SET GROUP_CONCAT_MAX_LEN=10000;
SET FOREIGN_KEY_CHECKS = 0;
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`'))
           FROM information_schema.TABLES
          WHERE TABLE_SCHEMA = 'pandora'
            AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
Duong Vo
sumber
Ini adalah satu-satunya yang saya temukan yang melakukan seluruh operasi dalam satu shebang sambil mengatasi kendala kunci asing.
Evan Mattson
2

Anda dapat melakukannya dalam satu perintah dengan MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

Anda mungkin harus membuat daftar tabel secara dinamis dalam kode.

Pendekatan alternatif akan menggunakan perpustakaan rutin tujuan umum untuk MySQL 5.

Asaf
sumber
2

Saya hanya ingin memposting SQL persis yang saya gunakan - itu adalah campuran dari 3 jawaban teratas:

SET GROUP_CONCAT_MAX_LEN=10000;

SET @del = (
    SELECT      CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';')
    FROM        information_schema.TABLES

    WHERE       TABLE_SCHEMA = 'database_name'
    AND         TABLE_NAME LIKE 'prefix_%'
);

PREPARE stmt FROM @del;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Danny Beckett
sumber
2

Hanya solusi lain menggunakan GROUP_CONCAT sehingga akan mengeksekusi satu permintaan drop seperti
DROP TABLE table1, table2, ..

SET @Drop_Stm = CONCAT('DROP TABLE ', (
      SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
      WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name'
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm;
DEALLOCATE PREPARE Stm;
Mohamad Hamouday
sumber
1

Saya menemukan bahwa pernyataan yang disiapkan agak sulit untuk bekerja untuk saya tetapi pengaturan GROUP_CONCAT_MAX_LENitu penting ketika Anda memiliki banyak tabel. Ini menghasilkan proses tiga langkah sederhana dengan potong dan tempel dari baris perintah mysql yang berfungsi dengan baik untuk saya:

SET GROUP_CONCAT_MAX_LEN=10000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

Kemudian dengan hati-hati potong dan tempel pernyataan DROP panjang yang dihasilkan .

drchuck
sumber
mengakhiri kueri dengan \Galih - alih ;memberikan hasil yang sedikit lebih bersih
Stuart Cardall