จะลบตารางของฉันที่มีคำนำหน้าทั้งหมดได้myprefix_
อย่างไร
หมายเหตุ: จำเป็นต้องดำเนินการใน phpMyAdmin
จะลบตารางของฉันที่มีคำนำหน้าทั้งหมดได้myprefix_
อย่างไร
หมายเหตุ: จำเป็นต้องดำเนินการใน phpMyAdmin
คำตอบ:
คุณไม่สามารถทำได้ด้วยคำสั่ง 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_%';
[...] LIKE 'myprefix\_%';
บางส่วนของคำตอบก่อนหน้านี้ดีมาก ฉันได้รวบรวมแนวคิดของพวกเขาพร้อมกับแนวคิดบางอย่างจากคำตอบอื่น ๆ บนเว็บ
ฉันต้องการลบตารางทั้งหมดที่เริ่มต้นด้วย '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 คนอื่น ๆ
show tables like 'prefix_%';
คัดลอกผลลัพธ์และวางลงในโปรแกรมแก้ไขข้อความหรือส่งออกแบบสอบถามไปยังไฟล์ใช้การค้นหาสองสามรายการและแทนที่เพื่อลบการจัดรูปแบบที่ไม่ต้องการออกและแทนที่\n
ด้วยเครื่องหมายจุลภาคใส่;
ท้ายและเพิ่มตารางดร็อปที่ด้านหน้า
คุณจะได้รับสิ่งที่มีลักษณะดังนี้:
drop table myprefix_1, myprefix_2, myprefix_3;
โซลูชันของแอนเดรี- มิลเลอร์นั้นดี แต่มีความเป็นมืออาชีพที่ดีกว่าและเป็นมืออาชีพกว่าเล็กน้อยที่จะช่วยให้คุณดำเนินการทั้งหมดได้ในครั้งเดียว ยังคงต้องการมากกว่าหนึ่งคำสั่ง แต่โซลูชันนี้จะช่วยให้คุณใช้ 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 ได้โดยมีการเปลี่ยนแปลงเล็กน้อย
SELECT CONCAT("DROP TABLE ", table_name, ";")
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME"
AND table_name LIKE "PREFIX_TABLE_NAME%";
ฉันวางตารางสำเร็จโดยแก้ไขแบบสอบถามเป็นแบบนี้
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;
คุณสามารถทำได้ในคำสั่งเดียวด้วย MySQL:
drop table myprefix_1, myprefix_2, myprefix_3;
คุณอาจต้องสร้างรายการตารางในโค้ดแบบไดนามิก
อีกทางเลือกหนึ่งคือการใช้ไลบรารีประจำวัตถุประสงค์ทั่วไปสำหรับ MySQL 5
ฉันแค่ต้องการโพสต์ 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;
เป็นวิธีแก้ปัญหาอื่นโดยใช้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;
ฉันพบว่างบที่เตรียมไว้นั้นค่อนข้างยุ่งยากในการทำงานให้ฉัน แต่การตั้งค่า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
แทนที่จะ;
ให้ผลลัพธ์ที่สะอาดกว่าเล็กน้อย