MySQL DROP ทุกตารางละเว้นคีย์ต่างประเทศ


403

มีวิธีง่าย ๆ ในการวางตารางทั้งหมดจากฐานข้อมูล MySQL โดยไม่สนใจข้อ จำกัด ของรหัสต่างประเทศที่อาจมีอยู่ในนั้นหรือไม่?


1
ถ้าคุณไม่มีเอนทิตีอื่น ๆ มากมายทำไมไม่ลองวางฐานข้อมูลและเริ่มจากศูนย์?
StuartLC

161
เพื่อสงวนสิทธิ์ของผู้ใช้
bcmcfc

5
ฉันเพิ่งรู้ว่าในขณะเดียวกันคุณได้รับคำตอบจาก Dion Truter ที่สมบูรณ์กว่าของฉันและแนะนำให้ยอมรับแทน (ส่วน "วางทุกตาราง" ไม่ได้รับการคุ้มครองจากฉัน)
chiccodoro

5
fyi หากคุณติดตั้ง phpMyAdmin คุณสามารถเลือกตารางทั้งหมดและวางได้ง่าย
ผู้ใช้

1
นั่นเป็นจริง แต่สำหรับ phpMyAdmin ในเวอร์ชัน 4.x เท่านั้น หากคุณเลือกตารางทั้งหมดและเลือกDropจากเมนูแบบเลื่อนลงคุณสามารถยกเลิกการเลือกForeign key checkช่องทำเครื่องหมาย
jmarceli

คำตอบ:


474

ฉันพบชุดคำสั่งการปล่อยที่สร้างขึ้นมีประโยชน์และแนะนำ tweaks เหล่านี้:

  1. จำกัด หยดที่สร้างขึ้นในฐานข้อมูลของคุณเช่นนี้:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

หมายเหตุ 1: สิ่งนี้ไม่ได้ดำเนินการคำสั่ง DROP แต่จะให้รายการของพวกเขา คุณจะต้องตัดและวางผลลัพธ์ลงในเอ็นจิน SQL ของคุณเพื่อเรียกใช้งาน

หมายเหตุ 2: ถ้าคุณมี VIEW คุณจะต้องแก้ไขแต่ละDROP TABLE `VIEW_NAME`ข้อความให้เป็นแบบแมนDROP VIEW `VIEW_NAME`นวล

  1. หมายเหตุต่อhttp://dev.mysql.com/doc/refman/5.5/en/drop-table.html การปล่อยด้วยการเรียงซ้อนนั้นไม่มีประโยชน์ / ทำให้เข้าใจผิด:

"ข้อ จำกัด และแบบเรียงซ้อนได้รับอนุญาตให้ทำให้การพอร์ตง่ายขึ้นใน MySQL 5.5 พวกเขาไม่ทำอะไรเลย"

ดังนั้นเพื่อให้คำสั่งดรอปทำงานหากคุณต้องการ:

SET FOREIGN_KEY_CHECKS = 0

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

SET FOREIGN_KEY_CHECKS = 1
  1. การดำเนินการขั้นสุดท้ายควรมีลักษณะดังนี้:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

หมายเหตุ: การใช้ผลลัพธ์ของ SELECT ง่ายขึ้นตัวเลือก mysql-B สามารถช่วยได้


6
@ Timmm: ฉันได้เขียน 3 หยดในคำตอบของฉัน - แต่นี่ไม่ได้ดำเนินการอย่างใดอย่างหนึ่ง คุณต้องคัดลอกจาก Stackoverflow และวางลงใน MySQL Workbench หรือที่ใดก็ได้ ด้วยการเลือกข้างต้นคุณจะได้รับการจับคู่ทั้งหมด "ฟรี" คุณเพียงแค่ต้องคัดลอกวาง
chiccodoro

3
ใช่ฉันรู้ แต่ฉันต้องการที่จะใช้มันในสคริปต์ สิ่งที่ฉันทำลงเอยด้วยการทำสิ่งนั้นจริง ๆDROP DATABASE foo; CREATE DATABASE foo;ซึ่งไม่เหมือนกัน แต่ทำงานให้ฉัน
Timmmm

2
ไม่สะดวกเมื่อมีหลายร้อยตาราง แต่ดีกว่าไม่มีอะไรหากสร้างฐานข้อมูลใหม่ไม่ใช่ตัวเลือก
Nicolas Raoul

2
@ Timmmm: ดูนี่อีกครั้ง - ถูกต้องมันไม่ตอบคำถามอย่างเต็มที่ คำตอบของ Jean ดูมีแนวโน้ม - มันสร้างทั้งคำสั่ง DROP และดำเนินการโดยอัตโนมัติในขณะที่ใช้ SET FOREIGN_KEY_CHECKS อย่างเหมาะสมก่อนและหลัง
chiccodoro

1
ใช้ขั้วถ้าคุณอยู่ในลินุกซ์หรือ mac และมันจะทำงานเพื่อเข้าสู่ระบบประเภทบัญชีของคุณ MySQL: MySQL -u <username> -p กดแล้วใส่ตอนนี้ป้อนรหัสผ่านที่คุณเลือกฐานข้อมูลแล้วเขียนโค้ดด้านบนเพื่อลบตาราง
ismnoiet

132

จากhttp://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys :

SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;

(หมายเหตุว่าคำตอบนี้วิธีการตรวจสอบที่สำคัญปิดการใช้งานต่างประเทศเพื่อที่จะสามารถวางตารางในการสั่งซื้อโดยพล. มันไม่ได้คำตอบวิธีการสร้างงบแบบเลื่อนตารางสำหรับตารางที่มีอยู่ทั้งหมดโดยอัตโนมัติและดำเนินการไว้ในสคริปต์เดียว. คำตอบของฌองทำ.)


10
หากคุณใช้ MySQL Workbench คุณสามารถหลีกเลี่ยงการพิมพ์ชื่อตารางทั้งหมดโดยเลือกตารางทั้งหมดในคอลัมน์ด้านซ้ายคลิกขวาจากนั้นเลือกตัวเลือก 'วางตาราง' ไอทีจะสร้าง SQL ที่คุณสามารถคัดลอกและวางระหว่างชุดคำสั่ง SET FOREGIN_KEY_CHECKS ซึ่งอาจคล้ายกันใน GUI อื่น ๆ เช่นกัน
chris

ขอบคุณที่เป็นประโยชน์และ @chris มีประโยชน์มากควรเพิ่มคำตอบ
Andrew

97

ต่อไปนี้เป็นขั้นตอนการจัดเก็บของ SurlyDre ที่ปรับเปลี่ยนเพื่อให้ละเว้นคีย์ต่างประเทศ:

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name 
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    SET FOREIGN_KEY_CHECKS = 0;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
        PREPARE stmt1 FROM @stmt_sql;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;
    SET FOREIGN_KEY_CHECKS = 1;
END$$

DELIMITER ;

call drop_all_tables(); 

DROP PROCEDURE IF EXISTS `drop_all_tables`;

2
ทำงานบนตารางล้มเหลวในการลบมุมมอง ยังลดการพิมพ์ของฉันลงอย่างหนาแน่น :) ขอบคุณ
chrisinmtown

7 ปีต่อมาฉันบอกว่าคุณควรห่อ_tableNameด้วย backquotes มิฉะนั้นจะล้มเหลวในบางตารางเช่นgroupหรือคำหลักอื่น ๆ
sashaaero

ดูแลความคิดเห็น! เลือก table_name จาก data_schema.TABLES ที่ table_schema = SCHEMA () และ table_type = "ฐานตาราง";
laurent belloeil

42

ทุกวิธีการข้างต้นรวมถึงงานที่มากขึ้นกว่า AFAICT นี้ ...

( mysqldump --add-drop-table --no-data -u root -p database | grep 'DROP TABLE' ) > ./drop_all_tables.sql
mysql -u root -p database < ./drop_all_tables.sql

2
ทำไมไม่เพียงmysqldumpไปที่ท่อmysqlโดยไม่ต้องผ่านไฟล์?
Rolf

2
@Rolf ไม่มีเหตุผลพิเศษ เคาะตัวเองออก
SkyLeach

2
ขอบคุณฉันทำไปแล้วลบวงเล็บและส่งmysqldumpเข้าไปgrepยังmysqlได้ผล ขอบคุณอีกครั้งสำหรับวิธีแก้ปัญหาของคุณมันดี
Rolf

5
อันนี้ไม่มีข้อ จำกัด กุญแจต่างประเทศ; ฉันได้เพิ่มสคริปต์ทุบตีที่นี่ตามคำตอบของคุณ: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger

sooooooooooooooo ฉลาด!
zx1986

25

จากคำตอบนี้ ,

ดำเนินการ:

  use `dbName`; --your db name here
  SET FOREIGN_KEY_CHECKS = 0; 
  SET @tables = NULL;
  SET GROUP_CONCAT_MAX_LEN=32768;

  SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables
  FROM   information_schema.tables 
  WHERE  table_schema = (SELECT DATABASE());
  SELECT IFNULL(@tables, '') INTO @tables;

  SET        @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
  PREPARE    stmt FROM @tables;
  EXECUTE    stmt;
  DEALLOCATE PREPARE stmt;
  SET        FOREIGN_KEY_CHECKS = 1;

สิ่งนี้จะลดตารางจากฐานข้อมูลที่ใช้งานอยู่ในปัจจุบัน useคุณสามารถตั้งค่าการใช้ฐานข้อมูลปัจจุบัน


มิฉะนั้นคำตอบที่ได้รับการยอมรับของดิออนนั้นง่ายกว่ายกเว้นคุณต้องดำเนินการสองครั้งก่อนเพื่อให้ได้คิวรีและอันดับที่สองในการเรียกใช้คิวรี ฉันให้เห็บกลับโง่ ๆ เพื่อหลีกเลี่ยงอักขระพิเศษใน db และชื่อตาราง

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here

น้ำยาที่สั้นและสะอาด วิธีที่ดีกว่าขั้นตอนทางเลือก
Rafael Renan Pacheco

16

นี่คือโซลูชันที่ใช้เคอร์เซอร์ ค่อนข้างยาว แต่ทำงานเป็น SQL แบตช์เดียว:

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name 
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
        PREPARE stmt1 FROM @stmt_sql;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;

END$$

DELIMITER ;

call drop_all_tables(); 

DROP PROCEDURE IF EXISTS `drop_all_tables`;

2
ดี แต่มันไม่ได้จัดการกับกุญแจต่างประเทศอย่างน่าเสียดาย
Timmmm

11

คุณทำได้:

select concat('drop table if exists ', table_name, ' cascade;')
  from information_schema.tables;

จากนั้นเรียกใช้คิวรีที่สร้างขึ้น พวกเขาจะวางทุกตารางเดียวในฐานข้อมูลปัจจุบัน

นี่คือความช่วยเหลือเกี่ยวกับdrop tableคำสั่งบางอย่าง


คำตอบข้างต้นจะถือว่า||เป็นตัวดำเนินการต่อข้อมูล โดยเฉพาะอย่างยิ่งโหมด MySQL SQL PIPES_AS_CONCATมี การอ้างอิง: dev.mysql.com/doc/refman/5.0/en/…
Ionuț G. Stan

@Ionut: เจ๋ง! ขอบคุณสำหรับการชี้ให้เห็นว่า แก้ไขตัวอย่างโค้ดเพื่อใช้concatแทน||
Pablo Santa Cruz

9

ฉันมาพร้อมกับการดัดแปลงนี้กับคำตอบของ Dion Truter เพื่อให้ง่ายขึ้นกับตารางจำนวนมาก:

SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n', 
              GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
                           SEPARATOR ';\n'),
              ';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';

สิ่งนี้จะคืนค่าทั้งหมดในฟิลด์เดียวดังนั้นคุณสามารถคัดลอกหนึ่งครั้งและลบตารางทั้งหมด (ใช้Copy Field Content (unquoted)ใน Workbench) หากคุณมีมากของตารางที่คุณอาจตีข้อ จำกัด GROUP_CONCAT()บางอย่างเกี่ยวกับ ถ้าเป็นเช่นนั้นเพิ่มตัวแปร max len (และmax_allowed_packetหากจำเป็น)


SET GROUP_CONCAT_MAX_LEN เป็นเคล็ดลับที่ฉันต้องการ ฉันมีสคริปต์ที่ใช้งานได้ แต่มักจะล้มเหลวในครั้งแรกด้วยชื่อตารางที่ถูกตัดทอนบางส่วนจากนั้นจึงเสร็จสิ้นเมื่อทำงานเป็นครั้งที่สอง ขอบคุณ!
dualmon

8

Googling ในหัวข้อมักจะนำฉันมาที่คำถาม SO ดังนั้นนี่คือการใช้งานโค้ด mysql ที่ลบทั้งตารางและมุมมอง:

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    SET FOREIGN_KEY_CHECKS = 0;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql1 = CONCAT('DROP TABLE IF EXISTS ', _tableName);
        SET @stmt_sql2 = CONCAT('DROP VIEW IF EXISTS ', _tableName);

        PREPARE stmt1 FROM @stmt_sql1;
        PREPARE stmt2 FROM @stmt_sql2;

        EXECUTE stmt1;
        EXECUTE stmt2;

        DEALLOCATE PREPARE stmt1;
        DEALLOCATE PREPARE stmt2;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;
    SET FOREIGN_KEY_CHECKS = 1;
END$$

DELIMITER ;

call drop_all_tables();

DROP PROCEDURE IF EXISTS `drop_all_tables`;

7

ซับเดียวเพื่อวางตารางทั้งหมดจากฐานข้อมูลที่กำหนด:

echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"

การเรียกใช้จะทำให้ตารางทั้งหมดจากฐานข้อมูล DATABASE_NAME

และสิ่งที่ดีเกี่ยวกับเรื่องนี้ก็คือชื่อฐานข้อมูลจะถูกเขียนเพียงครั้งเดียวอย่างชัดเจน


1
สิ่งนี้ได้ผลสำหรับฉัน แต่ฉันต้องแทนที่ -i ด้วย -I บน macOS High Sierra
Ali Selcuk

1
ขอบคุณ @AliSelcuk ทั้ง -i และ -I ใช้ได้กับฉันบน Ubuntu ดังนั้นฉันจะเปลี่ยนเป็น -I เพื่อให้การทำงานกับ macOS ได้เช่นกัน
mgershen

1
มีประโยชน์มากขอบคุณ! ฉันต้องส่งรหัสผ่านโดยใช้ -pPASSWORD (ไม่มีช่องว่างระหว่าง -p และ PASSWORD) ทั้งคำสั่ง mysql
Mike

6

นี่เป็นวิธีอัตโนมัติในการทำเช่นนี้ผ่านสคริปต์ทุบตี:

host=$1
dbName=$2
user=$3
password=$4

if [ -z "$1" ]
then
    host="localhost"
fi

# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do  echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done

ชอบโซลูชันนี้ แต่ฉันไม่เห็นวิธีการใช้ตัวแปรโฮสต์ ดูเหมือนจะไม่ถูกใช้ในการเรียก mysql ใด ๆ ใน for for loop
Matthew Zackschewski

1
ขออภัยพลาดการวางไว้ในคำสั่งอัปเดต
kfox

5

หากใน linux (หรือระบบอื่น ๆ ที่รองรับ pip, echo และ grep) คุณสามารถทำได้ด้วยหนึ่งบรรทัด:

echo "SET FOREIGN_KEY_CHECKS = 0;" > temp.txt; \
mysqldump -u[USER] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP >> temp.txt; \
echo "SET FOREIGN_KEY_CHECKS = 1;" >> temp.txt; \
mysql -u[USER] -p[PASSWORD] [DATABASE] < temp.txt;

ฉันรู้ว่านี่เป็นคำถามเก่า แต่ฉันคิดว่าวิธีนี้รวดเร็วและง่าย


2

ใน PHP มันง่ายเหมือน:

$pdo = new PDO('mysql:dbname=YOURDB', 'root', 'root');

$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');

$query = "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
          FROM information_schema.tables
          WHERE table_schema = 'YOURDB'";

foreach($pdo->query($query) as $row) {
    $pdo->exec($row[0]);
}

$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');

เพียงจำไว้ว่าให้เปลี่ยน YOURDB เป็นชื่อฐานข้อมูลของคุณและเห็นได้ชัดว่าผู้ใช้ / รหัสผ่าน


2

ในเชลล์ Linux เช่น bash / zsh:

DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
  mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
  "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
   FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
  } | mysql "$DATABASE_TO_EMPTY"

สิ่งนี้จะสร้างคำสั่งจากนั้นให้ไพพ์ไปยังอินสแตนซ์ไคลเอ็นต์ลำดับที่ 2 ซึ่งจะลบตารางทันที

แน่นอนว่าฉลาดคือการคัดลอกมาจากคำตอบอื่น ๆ ที่นี่ - ฉันแค่ต้องการซับ - คัดลอกและวางหนึ่ง (ish) เพื่อทำจริงงาน OP ต้องการ

บันทึกของหลักสูตรคุณจะต้องใส่ข้อมูลประจำตัวของคุณใน (สองครั้ง) ในคำสั่ง mysql เหล่านี้ด้วยเว้นแต่ว่าคุณมีการตั้งค่าความปลอดภัยต่ำมาก (หรือคุณอาจใช้นามแฝงคำสั่ง mysql เพื่อรวมเครดิตของคุณ)


2

เพียงแค่ใส่ความเห็นที่เป็นประโยชน์บางอย่างที่ทำโดย Jonathan Wattเพื่อวางตารางทั้งหมด

MYSQL="mysql -h HOST -u USERNAME -pPASSWORD DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL

มันช่วยฉันและฉันหวังว่ามันจะมีประโยชน์


2

วางตารางทั้งหมดจากฐานข้อมูลด้วยบรรทัดเดียวจากบรรทัดคำสั่ง:

mysqldump -u [user_name] -p[password] -h [host_name] --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [user_name] -p[password] -h [host_name] [database_name]

โดยที่ [user_name], [password], [host_name] และ [database_name] ต้องถูกแทนที่ด้วยข้อมูลจริง (ผู้ใช้รหัสผ่านชื่อโฮสต์ชื่อฐานข้อมูล)


1

นี่เป็นโพสต์เก่า ๆ แต่ไม่มีคำตอบที่นี่จริงๆตอบคำถามในความคิดของฉันดังนั้นฉันหวังว่าโพสต์ของฉันจะช่วยให้ผู้คน!

ฉันพบวิธีแก้ปัญหานี้สำหรับคำถามอื่นที่ทำงานได้ดีสำหรับฉัน:

mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done

นั่นจะทำให้ตารางทั้งหมดของคุณว่างเปล่าในฐานข้อมูลDB_NAMEและไม่เพียงแสดงTRUNCATEบรรทัดคำสั่งเท่านั้น

หวังว่านี่จะช่วยได้!


มีประโยชน์ แต่ไม่ได้ตอบคำถามจริงๆ
jrosell

1

การสร้างคำตอบโดย @Dion Truter และ @Wade Williams สคริปต์เชลล์ต่อไปนี้จะดร็อปตารางทั้งหมดหลังจากแสดงสิ่งที่กำลังจะเริ่มทำงานและให้โอกาสที่จะยกเลิกการใช้ Ctrl-C

#!/bin/bash

DB_HOST=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx
DB_NAME=xxx

CMD="mysql -sN -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME}"

# Generate the drop statements
TMPFILE=/tmp/drop-${RANDOM}.sql
echo 'SET FOREIGN_KEY_CHECKS = 0;' > ${TMPFILE}
${CMD} $@ >> ${TMPFILE} << ENDD
    SELECT concat('DROP TABLE IF EXISTS \`', table_name, '\`;')
    FROM information_schema.tables
    WHERE table_schema = '${DB_NAME}';
ENDD
echo 'SET FOREIGN_KEY_CHECKS = 1;' >> ${TMPFILE}

# Warn what we are about to do
echo
cat ${TMPFILE}
echo
echo "Press ENTER to proceed (or Ctrl-C to abort)."
read

# Run the SQL
echo "Dropping tables..."
${CMD} $@ < ${TMPFILE}
echo "Exit status is ${?}."
rm ${TMPFILE}

0

วิธีการแก้ปัญหานี้ขึ้นอยู่กับคำตอบ @SkyLeach แต่ด้วยการสนับสนุนของการวางตารางที่มีคีย์ต่างประเทศ

echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql


0

ง่ายและชัดเจน (อาจจะ)

อาจไม่ใช่วิธีแฟนซี แต่สิ่งนี้ได้ผลกับฉันและช่วยชีวิตฉันไว้

ทำงานสำหรับรุ่นเซิร์ฟเวอร์: 5.6.38 MySQL Community Server (GPL)

ขั้นตอนที่ฉันติดตาม:

 1. generate drop query using concat and group_concat.
 2. use database
 3. disable key constraint check
 4. copy the query generated from step 1
 5. enable key constraint check
 6. run show table

เปลือก MySQL

mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

mysql> 

ป้อนคำอธิบายรูปภาพที่นี่


-1

ฉันใช้สิ่งต่อไปนี้กับเซิร์ฟเวอร์ MSSQL:

if (DB_NAME() = 'YOUR_DATABASE') 
begin
    while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
    begin
         declare @sql nvarchar(2000)
         SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
         FROM information_schema.table_constraints
         WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
         exec (@sql)
         PRINT @sql
    end

    while(exists(select 1 from INFORMATION_SCHEMA.TABLES))
    begin
         declare @sql2 nvarchar(2000)
         SELECT TOP 1 @sql2=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
         FROM INFORMATION_SCHEMA.TABLES
        exec (@sql2)
        PRINT @sql2
    end
end
else
    print('Only run this script on the development server!!!!')

แทนที่ YOUR_DATABASE ด้วยชื่อของฐานข้อมูลของคุณหรือลบคำสั่ง IF ทั้งหมด (ฉันชอบความปลอดภัยที่เพิ่มขึ้น)


-7

ทางออกที่ดีที่สุดสำหรับฉันจนถึงตอนนี้

เลือกฐานข้อมูล -> คลิกขวา -> งาน -> สร้างสคริปต์ - จะเปิดตัวช่วยสร้างการสร้างสคริปต์ หลังจากเลือกวัตถุในตัวเลือกการเขียนสคริปต์ชุดคลิกปุ่มขั้นสูง ภายใต้"สคริปต์ DROP และสร้าง"เลือกสคริปต์ DROP

เรียกใช้สคริปต์


มันเกือบจะได้ผล แต่ฉันคลิกที่ปุ่มสีเขียวก่อนที่ปุ่มสีน้ำเงินและฉันได้รับกล่องทางด้านซ้ายและฉันคลิกยกเลิก แต่แล้วฉันก็ดื่มกาแฟและลืมมันไป
Rolf

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