SQL: การลบตารางด้วยคำนำหน้า


101

จะลบตารางของฉันที่มีคำนำหน้าทั้งหมดได้myprefix_อย่างไร

หมายเหตุ: จำเป็นต้องดำเนินการใน phpMyAdmin

คำตอบ:


178

คุณไม่สามารถทำได้ด้วยคำสั่ง MySQL เพียงคำสั่งเดียวอย่างไรก็ตามคุณสามารถใช้ MySQL เพื่อสร้างคำสั่งสำหรับคุณ:

ใน MySQL shell หรือผ่าน PHPMyAdmin ให้ใช้แบบสอบถามต่อไปนี้

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

สิ่งนี้จะสร้างคำสั่ง DROP ซึ่งคุณสามารถคัดลอกและดำเนินการเพื่อวางตารางได้

แก้ไข: ข้อจำกัดความรับผิดชอบที่นี่ - คำสั่งที่สร้างขึ้นข้างต้นจะทิ้งตารางทั้งหมดในฐานข้อมูลทั้งหมดที่มีคำนำหน้านั้น หากคุณต้องการ จำกัด เฉพาะฐานข้อมูลเฉพาะให้แก้ไขแบบสอบถามให้มีลักษณะเช่นนี้และแทนที่ database_name ด้วย database_name ของคุณเอง:

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

ฉันมีฐานข้อมูลเดียวดังนั้นฉันจึงไม่ต้องการฐานข้อมูลที่สอง
Deniz Zoeteman

4
@ElijahLynn แหล่งที่มาของขีด จำกัด อาจเป็นเพราะความยาวสูงสุดของ GROUP_CONCAT คุณสามารถขยายดูตัวอย่างได้ที่นี่
Asaf David

7
หมายเหตุถึงตนเองเพิ่มจำนวนถ่านสูงสุด: SET SESSION group_concat_max_len = 999999999;
Mohammed Joraid

2
โปรดทราบว่าในบางกรณีจำเป็นต้องใช้เครื่องหมายขีดล่างในชื่อคำนำหน้าตาราง[...] LIKE 'myprefix\_%';
Magictallguy

1
สิ่งนี้ส่งคืน table_names ที่ซ้ำกันจำนวนมาก คำตอบที่ Pankaj Khurana โพสต์ได้ผลดีกว่า IMHO
Jeremy

37

บางส่วนของคำตอบก่อนหน้านี้ดีมาก ฉันได้รวบรวมแนวคิดของพวกเขาพร้อมกับแนวคิดบางอย่างจากคำตอบอื่น ๆ บนเว็บ

ฉันต้องการลบตารางทั้งหมดที่เริ่มต้นด้วย 'temp_' หลังจากทำซ้ำสองสามครั้งฉันก็ได้พบกับบล็อกโค้ดนี้:

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

ฉันหวังว่านี่จะเป็นประโยชน์กับโปรแกรมเมอร์ MySQL / PHP คนอื่น ๆ


1
นี่คือคำตอบที่ถูกต้อง คำตอบอื่น ๆ ใช้หลายขั้นตอนหรือกำหนดให้ทำด้วยตนเอง ไม่รู้ว่าคำตอบนี้ไม่มีโหวตอีกหลังจาก 4 ปีได้อย่างไร!
gbe

25
show tables like 'prefix_%';

คัดลอกผลลัพธ์และวางลงในโปรแกรมแก้ไขข้อความหรือส่งออกแบบสอบถามไปยังไฟล์ใช้การค้นหาสองสามรายการและแทนที่เพื่อลบการจัดรูปแบบที่ไม่ต้องการออกและแทนที่\nด้วยเครื่องหมายจุลภาคใส่;ท้ายและเพิ่มตารางดร็อปที่ด้านหน้า

คุณจะได้รับสิ่งที่มีลักษณะดังนี้:

drop table myprefix_1, myprefix_2, myprefix_3;

1
ไม่สามารถเข้าถึง information_schema.tables บนเว็บโฮสต์ที่ฉันใช้อยู่นี่คือวิธีที่จะไปขอบคุณ!
Florent Roques

10

โซลูชันของแอนเดรี- มิลเลอร์นั้นดี แต่มีความเป็นมืออาชีพที่ดีกว่าและเป็นมืออาชีพกว่าเล็กน้อยที่จะช่วยให้คุณดำเนินการทั้งหมดได้ในครั้งเดียว ยังคงต้องการมากกว่าหนึ่งคำสั่ง แต่โซลูชันนี้จะช่วยให้คุณใช้ SQL สำหรับงานสร้างอัตโนมัติ

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;

หมายเหตุ: รหัสนี้ขึ้นอยู่กับแพลตฟอร์มสำหรับ MySQL แต่แน่นอนว่าสามารถนำไปใช้กับ Postgre, Oracle และ MS SQL ได้โดยมีการเปลี่ยนแปลงเล็กน้อย


ข้อผิดพลาด 1064 (42000): คุณมีข้อผิดพลาดในไวยากรณ์ SQL ของคุณ ตรวจสอบคู่มือที่สอดคล้องกับเวอร์ชันเซิร์ฟเวอร์ MySQL ของคุณสำหรับไวยากรณ์ที่ถูกต้องที่จะใช้ใกล้ '@tbls' ที่บรรทัด 1 ข้อผิดพลาด 1243 (HY000): ตัวจัดการคำสั่งที่ไม่รู้จักที่เตรียมไว้ (stmt) ที่มอบให้กับ EXECUTE ERROR 1243 (HY000): ตัวจัดการคำสั่งที่ไม่รู้จักเตรียมไว้ (stmt) มอบให้กับ DEALLOCATE PREPARE
Roni Tovi

ข้อผิดพลาดของไวยากรณ์ที่: PREPARE stmt FROM 'DROP TABLE @tbls';
ledawg


3

ฉันวางตารางสำเร็จโดยแก้ไขแบบสอบถามเป็นแบบนี้

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;

นี่เป็นสิ่งเดียวที่ฉันพบว่าดำเนินการทั้งหมดใน Shebang เดียวในขณะที่จัดการกับข้อ จำกัด ของคีย์ต่างประเทศ
Evan Mattson

2

คุณสามารถทำได้ในคำสั่งเดียวด้วย MySQL:

drop table myprefix_1, myprefix_2, myprefix_3;

คุณอาจต้องสร้างรายการตารางในโค้ดแบบไดนามิก

อีกทางเลือกหนึ่งคือการใช้ไลบรารีประจำวัตถุประสงค์ทั่วไปสำหรับ MySQL 5


2

ฉันแค่ต้องการโพสต์ SQL ที่แน่นอนที่ฉันใช้ซึ่งเป็นส่วนผสมของคำตอบ 3 อันดับแรก:

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;

2

เป็นวิธีแก้ปัญหาอื่นโดยใช้GROUP_CONCATดังนั้นมันจะดำเนินการแบบสอบถามแบบหล่นเดียวเช่น
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;

1

ฉันพบว่างบที่เตรียมไว้นั้นค่อนข้างยุ่งยากในการทำงานให้ฉัน แต่การตั้งค่าGROUP_CONCAT_MAX_LENเป็นสิ่งสำคัญเมื่อคุณมีโต๊ะจำนวนมาก สิ่งนี้ทำให้เกิดกระบวนการสามขั้นตอนง่ายๆด้วยการตัดและวางจากบรรทัดคำสั่งmysqlที่ใช้งานได้ดีสำหรับฉัน:

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_%';

จากนั้นตัดและวางคำสั่งDROP ที่ยาวอย่างระมัดระวัง


การลงท้ายด้วยแบบสอบถาม\Gแทนที่จะ;ให้ผลลัพธ์ที่สะอาดกว่าเล็กน้อย
Stuart Cardall
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.