Bagaimana cara menghapus tabel saya yang semuanya memiliki awalan myprefix_
?
Catatan: perlu menjalankannya di phpMyAdmin
Bagaimana cara menghapus tabel saya yang semuanya memiliki awalan myprefix_
?
Catatan: perlu menjalankannya di phpMyAdmin
Jawaban:
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_%';
[...] LIKE 'myprefix\_%';
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.
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 \n
dengan 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;
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.
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
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;
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.
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;
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;
Saya menemukan bahwa pernyataan yang disiapkan agak sulit untuk bekerja untuk saya tetapi pengaturan GROUP_CONCAT_MAX_LEN
itu 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 .
\G
alih - alih ;
memberikan hasil yang sedikit lebih bersih