Saya memperbarui jawaban saya untuk melakukan drop tabel tanpa menggunakan prosedur yang tersimpan. Cobalah !!!
RolandoMySQLDBA
Jawaban:
11
Berikut adalah prosedur tersimpan yang menerima Database dan String Awalan sebagai Parameter:
DELIMITER $$DROPPROCEDURE DropTablesWithPrefix $$CREATEPROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGINDECLARE ndx,maxidx INT;DECLARE giventable,SQLSTMT VARCHAR(500);CREATETABLE TableZapList(
droptablesql VARCHAR(512),
idx INT NOTNULL AUTO_INCREMENT PRIMARYKEY) ENGINE=MyISAM;INSERTINTO TableZapList (droptablesql)SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name)FROM information_schema.tablesWHERE table_schema = db AND SUBSTR(table_name,LENGTH(prfx))= prfx;SELECT COUNT(1)INTO maxid FROM TableZapList;IF maxid =0THEN
LEAVE StoredProcedure;ENDIF;<BR>SET ndx =0;WHILE ndx < maxid DOSET ndx = ndx +1;SELECT droptablesql INTO SQLSTMT FROM TableZapList WHERE idx = ndx;SET@sql = SQLSTMT;
PREPARE stmt FROM@sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;ENDWHILE;<BR>SELECT droptablesql FROM TableZapList;DROPTABLE TableZapList;END;
DELIMITER ;
UPDATE 2011-07-12 14:55 EDT
Saya hanya memikirkan cara yang lebih bersih dan sederhana. Alih-alih menggunakan prosedur tersimpan, cukup gunakan fungsi GROUP_CONCAT untuk mengumpulkan semua tabel untuk zap. Kemudian buat menjadi satu permintaan:
Berikut ini adalah kueri untuk menjatuhkan semua tabel yang dimulai dengan wp_pol di database saat ini:
Skrip Rolandos berfungsi tetapi orang mungkin perlu meningkatkan parameter group_concat_max_len jika Anda memiliki banyak tabel atau nama tabel yang sangat panjang: SET SESSION group_concat_max_len = 1000000;
JohnP
Alih-alih mengubah grup + concat_max_len, saya menggunakan subquery dengan batas, dan melakukan tetesan dalam langkah
pedromanoel
The SUBSTRkondisi dalam INSERTharus: SUBSTR(table_name, 1, LENGTH(prfx)) = prfxmaka itu bekerja dengan baik.
laurent
8
Pertama, buat skrip untuk melakukan ini di prompt Unix:
$ echo "select concat('drop table ', table_name, ';') from information_schema.tables where table_name like 'prefix_%';"|mysql --user=root --password=blah --batch >drop.sql
Ganti awalan dengan Anda sendiri. The --batchpilihan menekan mewah format MySQL tidak secara default sehingga Anda dapat menghasilkan script SQL runnable.
Tinjau skrip dan jika terlihat OK, jalankan drop.sqlsaat mysql>diminta.
Saya sudah melakukan skrip pembantu PHP untuk melakukan ini, namun saya bertanya-tanya apakah itu dapat dilakukan dengan menggunakan satu permintaan.
poelinca
1
Jawaban sederhana: Tidak. Jawaban kompleks: Ya, jika Anda membungkusnya dengan prosedur tersimpan . Jadi Anda bisa menjalankannya dalam satu perintah, tetapi itu akan sama dengan memanggil skrip.
Gayus
4
Anda harus menanyakan tabel sistem untuk nama tabel tersebut dan membuat string untuk menjalankannya secara dinamis. Dalam SQL Server saya akan melakukan sesuatu seperti:
declare@x varchar(max),@enter char(2);select@x ='',@enter = char(13)+char(10);Select@x =@x +'drop table '+ table_name +';'+@enter from information_schema.tables where table_name like'%accounting%'print@xexecute(@x);
Sekarang Anda harus menemukan tabel sistem yang sesuai di MySQL.
Saya membaca jawaban Anda dengan sangat hati-hati. Ini identik dengan jawaban saya. Meskipun dalam dialek SQL Server, jawaban Anda pada prinsipnya adalah jawaban pertama yang benar. +1 !!!
RolandoMySQLDBA
3
Untuk menjawab pertanyaan Anda, tidak. Tidak di MySQL menggunakan perintah / permintaan tunggal. Anda harus mengaitkan perintah.
Namun, jika Anda ingin mencapai tujuan Anda, inilah salah satu caranya:
Dari skrip bash, sesuatu seperti:
#/bin/bash
TABLES=`mysql -s -e "SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) AS T FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'dp_%'"-u user-p`for i in$TABLES;
do
echo "DROP TABLE $i;">> drops.sql ;
done
cat drops.sql
Kemudian tinjau file drops.sql. Jika semuanya baik-baik saja, buat CADANGAN , lalu ...
mysql -u username -p -v --show-warnings < drops.sql
Anda selalu dapat menggunakan DATABASE ADMINISTRATOR seperti navicat dan masalah-masalah semacam itu akan menghilang dengan memilih dan menghapus yang sederhana.
Jawaban:
Berikut adalah prosedur tersimpan yang menerima Database dan String Awalan sebagai Parameter:
UPDATE 2011-07-12 14:55 EDT
Saya hanya memikirkan cara yang lebih bersih dan sederhana. Alih-alih menggunakan prosedur tersimpan, cukup gunakan fungsi GROUP_CONCAT untuk mengumpulkan semua tabel untuk zap. Kemudian buat menjadi satu permintaan:
Berikut ini adalah kueri untuk menjatuhkan semua tabel yang dimulai dengan wp_pol di database saat ini:
Selanjutnya yang harus dilakukan adalah menyimpan hasilnya di
Hal terakhir adalah mengeksekusi SQL dinamis menggunakan tiga (3) perintah ini:
Berikut ini adalah demonstrasi menggunakan MySQL 5.5.12 di Windows yang berfungsi:
Cobalah !!!
sumber
SUBSTR
kondisi dalamINSERT
harus:SUBSTR(table_name, 1, LENGTH(prfx)) = prfx
maka itu bekerja dengan baik.Pertama, buat skrip untuk melakukan ini di prompt Unix:
Ganti awalan dengan Anda sendiri. The
--batch
pilihan menekan mewah format MySQL tidak secara default sehingga Anda dapat menghasilkan script SQL runnable.Tinjau skrip dan jika terlihat OK, jalankan
drop.sql
saatmysql>
diminta.sumber
Anda harus menanyakan tabel sistem untuk nama tabel tersebut dan membuat string untuk menjalankannya secara dinamis. Dalam SQL Server saya akan melakukan sesuatu seperti:
Sekarang Anda harus menemukan tabel sistem yang sesuai di MySQL.
sumber
Untuk menjawab pertanyaan Anda, tidak. Tidak di MySQL menggunakan perintah / permintaan tunggal. Anda harus mengaitkan perintah.
Namun, jika Anda ingin mencapai tujuan Anda, inilah salah satu caranya:
Dari skrip bash, sesuatu seperti:
Kemudian tinjau file drops.sql. Jika semuanya baik-baik saja, buat CADANGAN , lalu ...
sumber
Anda selalu dapat menggunakan DATABASE ADMINISTRATOR seperti navicat dan masalah-masalah semacam itu akan menghilang dengan memilih dan menghapus yang sederhana.
sumber