MySQL: DROP TABLE Dimulai dengan Awalan


8

CONTOH: Saya memiliki lebih dari 30 tabel yang dimulai dengan awalan "dp_" dan sekitar 12 dimulai dengan "ex_".

PERTANYAAN: Bagaimana saya bisa menjatuhkan semua tabel mulai "dp_" dalam satu permintaan?


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 $$

DROP PROCEDURE DropTablesWithPrefix $$
CREATE PROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
StoredProcedure:BEGIN
    DECLARE ndx,maxidx INT;
    DECLARE giventable,SQLSTMT VARCHAR(500);

    CREATE TABLE TableZapList
    (
        droptablesql VARCHAR(512),
        idx INT NOT NULL AUTO_INCREMENT PRIMARY KEY
    ) ENGINE=MyISAM;

    INSERT INTO TableZapList (droptablesql)
    SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name)
    FROM information_schema.tables
    WHERE table_schema = db AND SUBSTR(table_name,LENGTH(prfx)) = prfx;
    SELECT COUNT(1) INTO maxid FROM TableZapList;

    IF maxid = 0 THEN
        LEAVE StoredProcedure;
    END IF;<BR>

    SET ndx = 0;
    WHILE ndx < maxid DO
        SET ndx = ndx + 1;
        SELECT droptablesql INTO SQLSTMT FROM TableZapList WHERE idx = ndx;
        SET @sql = SQLSTMT;
        PREPARE stmt FROM @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END WHILE;<BR>

    SELECT droptablesql FROM TableZapList;
    DROP TABLE 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:

SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')
FROM information_schema.tables
WHERE table_schema=database()
AND table_name like 'wp_pol%';

Selanjutnya yang harus dilakukan adalah menyimpan hasilnya di

SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')
INTO @dropcmd
FROM information_schema.tables
WHERE table_schema=database()
AND table_name like 'wp_pol%';

Hal terakhir adalah mengeksekusi SQL dinamis menggunakan tiga (3) perintah ini:

PREPARE s1 FROM @dropcmd;
EXECUTE s1;
DEALLOCATE PREPARE s1;

Berikut ini adalah demonstrasi menggunakan MySQL 5.5.12 di Windows yang berfungsi:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 5.5.12 MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

MySQL (Current test) :: use garbage
Database changed
MySQL (Current garbage) :: show tables;
+------------------------------+
| Tables_in_garbage            |
+------------------------------+
| datas                        |
| rolando                      |
| wp_commentmeta               |
| wp_comments                  |
| wp_contact_form_7            |
| wp_links                     |
| wp_most_read_hits            |
| wp_options                   |
| wp_pollsa                    |
| wp_pollsip                   |
| wp_pollsq                    |
| wp_postmeta                  |
| wp_posts                     |
| wp_posts_idtracker           |
| wp_tantan_wordpress_s3_cache |
| wp_term_relationships        |
| wp_term_taxonomy             |
| wp_terms                     |
| wp_usermeta                  |
| wp_users                     |
| wp_w3tc_cdn_queue            |
+------------------------------+
21 rows in set (0.00 sec)

MySQL (Current garbage) :: SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';') INTO @dropcmd FROM information_schema.tables WHERE table_schema=database() AND table_name like 'wp_pol%';
Query OK, 1 row affected (0.00 sec)

MySQL (Current garbage) :: SELECT @dropcmd;
+--------------------------------------------------------------------+
| @dropcmd                                                           |
+--------------------------------------------------------------------+
| DROP TABLE garbage.wp_pollsa,garbage.wp_pollsip,garbage.wp_pollsq; |
+--------------------------------------------------------------------+
1 row in set (0.00 sec)

MySQL (Current garbage) :: PREPARE s1 FROM @dropcmd; EXECUTE s1; DEALLOCATE PREPARE s1;
Query OK, 0 rows affected (0.00 sec)
Statement prepared

Query OK, 0 rows affected (0.01 sec)

Query OK, 0 rows affected (0.00 sec)

MySQL (Current garbage) :: show tables;
+------------------------------+
| Tables_in_garbage            |
+------------------------------+
| datas                        |
| rolando                      |
| wp_commentmeta               |
| wp_comments                  |
| wp_contact_form_7            |
| wp_links                     |
| wp_most_read_hits            |
| wp_options                   |
| wp_postmeta                  |
| wp_posts                     |
| wp_posts_idtracker           |
| wp_tantan_wordpress_s3_cache |
| wp_term_relationships        |
| wp_term_taxonomy             |
| wp_terms                     |
| wp_usermeta                  |
| wp_users                     |
| wp_w3tc_cdn_queue            |
+------------------------------+
18 rows in set (0.00 sec)

MySQL (Current garbage) ::

Cobalah !!!


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 @x
execute (@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

1

Anda selalu dapat menggunakan DATABASE ADMINISTRATOR seperti navicat dan masalah-masalah semacam itu akan menghilang dengan memilih dan menghapus yang sederhana.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.