MySQL DROP tất cả các bảng, bỏ qua các khóa ngoại


403

Có một cách dễ dàng để loại bỏ tất cả các bảng từ cơ sở dữ liệu MySQL, bỏ qua mọi ràng buộc khóa ngoại có thể có trong đó không?


1
Trừ khi bạn có rất nhiều thực thể khác, tại sao không chỉ DROP DATABASE và bắt đầu lại từ đầu?
StuartLC

161
Để bảo vệ quyền riêng tư của người dùng.
bcmcfc

5
Tôi chỉ nhận ra rằng trong khi đó bạn nhận được câu trả lời của Dion Truter hoàn chỉnh hơn của tôi và đề nghị chấp nhận điều đó thay vào đó. (phần "thả tất cả các bảng" không được bao phủ bởi tôi)
chiccodoro

5
fyi nếu bạn đã cài đặt phpMyAdmin, thật dễ dàng để chọn tất cả các bảng và thả chúng.
Người dùng

1
Điều đó đúng nhưng chỉ với phpMyAdmin trong phiên bản 4.x. Nếu bạn chọn tất cả các bảng và chọn Droptừ menu thả xuống, bạn có thể bỏ chọn Foreign key checkhộp kiểm.
jmarceli

Câu trả lời:


474

Tôi thấy tập hợp các câu lệnh thả được tạo hữu ích và khuyên dùng các chỉnh sửa này:

  1. Giới hạn các giọt được tạo vào cơ sở dữ liệu của bạn như thế này:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

Lưu ý 1: Điều này không thực thi các câu lệnh DROP, nó chỉ cung cấp cho bạn một danh sách của chúng. Bạn sẽ cần phải cắt và dán đầu ra vào công cụ SQL của mình để thực thi chúng.

Lưu ý 2: Nếu bạn có XEM, bạn sẽ phải sửa từng DROP TABLE `VIEW_NAME`câu thành DROP VIEW `VIEW_NAME`thủ công.

  1. Lưu ý, mỗi http://dev.mysql.com/doc/refman/5.5/en/drop-table.html , thả với tầng là vô nghĩa / gây hiểu lầm:

"RESTRICT và CASCADE được phép chuyển dễ dàng hơn. Trong MySQL 5.5, họ không làm gì cả."

Do đó, để các câu lệnh thả hoạt động nếu bạn cần:

SET FOREIGN_KEY_CHECKS = 0

Điều này sẽ vô hiệu hóa kiểm tra tính toàn vẹn tham chiếu - vì vậy khi bạn hoàn thành việc thực hiện các giọt bạn cần, bạn sẽ muốn đặt lại kiểm tra khóa bằng

SET FOREIGN_KEY_CHECKS = 1
  1. Việc thực hiện cuối cùng sẽ giống như:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

NB: để sử dụng đầu ra của SELECT dễ dàng hơn, tùy chọn mysql -B có thể giúp đỡ.


6
@Timmm: Tôi đã viết 3 giọt trong câu trả lời của mình - tuy nhiên, điều này cũng không thực thi chúng. Bạn phải sao chép chúng từ Stackoverflow và dán chúng vào MySQL Workbench của bạn hoặc bất cứ nơi nào. Với lựa chọn ở trên, bạn nhận được tất cả các giọt phù hợp "miễn phí". Bạn chỉ cần sao chép-dán chúng.
chiccodoro

3
Vâng tôi biết, nhưng tôi muốn sử dụng nó trong một kịch bản. Những gì tôi đã thực sự làm là DROP DATABASE foo; CREATE DATABASE foo;, nó không hoàn toàn giống nhau nhưng làm việc cho tôi.
Timmmm

2
Không thuận tiện khi có hàng trăm bảng, nhưng tốt hơn là không có gì nếu tạo lại cơ sở dữ liệu không phải là một tùy chọn.
Nicolas Raoul

2
@Timmmm: Nhìn lại điều này một lần nữa - bạn nói đúng, nó không trả lời đầy đủ câu hỏi. Câu trả lời của Jean có vẻ đầy hứa hẹn - nó tự động tạo ra các câu lệnh DROP và thực thi chúng, trong khi áp dụng đúng cách FOR FOREIGN_KEY_CHECKS trước và sau.
chiccodoro

1
sử dụng thiết bị đầu cuối nếu bạn đang ở trong linux hoặc mac và nó sẽ hoạt động để đăng nhập vào loại tài khoản mysql của bạn: mysql -u <tên người dùng> -p sau đó nhấn enter ngay nhập mật khẩu của bạn chọn cơ sở dữ liệu sau đó viết mã ở trên để xóa bảng
ismnoiet

132

Từ http://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-forign-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;

(Lưu ý rằng câu trả lời này làm thế nào để vô hiệu hóa kiểm tra chính nước ngoài để có thể thả các bảng theo thứ tự tùy ý. Nó không trả lời làm thế nào để tự động tạo ra các báo cáo thả bảng cho tất cả các bảng hiện có và thực hiện chúng trong một kịch bản duy nhất. Câu trả lời của Jean làm.)


10
Nếu bạn sử dụng MySQL Workbench, bạn có thể tránh phải nhập tất cả các tên bảng bằng cách chọn tất cả các bảng trong cột bên trái, nhấp chuột phải, sau đó tùy chọn 'thả bảng'. CNTT sẽ tạo SQL mà bạn có thể sao chép và dán giữa câu lệnh SET FOREGIN_KEY_CHECKS - có thể tương tự trong các GUI khác.
chris

cảm ơn hữu ích và @chris siêu hữu ích, nên thêm câu trả lời
Andrew

97

Dưới đây là quy trình lưu trữ của SurlyDre được sửa đổi để các khóa ngoại được bỏ qua:

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
Hoạt động trên bảng, không xóa được lượt xem. Vẫn giảm tiếng gõ của tôi ồ ạt :) thx.
chrisinmtown

7 năm sau tôi sẽ nói bạn nên kết thúc _tableNamebằng một backquote. Nếu không, nó sẽ thất bại trên một số bảng như grouphoặc các từ khóa khác.
sashaaero

Hãy quan tâm quan điểm! CHỌN tên_bảng TỪ information_schema.TABLES WHERE table_schema = SCHema () AND table_type = "BASE TABLE";
belloeil laurent 27/12/19

42

mọi cách tiếp cận ở trên bao gồm nhiều công việc hơn so với phương pháp này ...

( 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
Tại sao không chỉ đường ống mysqldumpđến mysql, mà không đi qua một tập tin?
Rolf

2
@Rolf không có lý do cụ thể. Tự rút khỏi.
SkyLeach

2
Cảm ơn, tôi đã làm, loại bỏ các dấu ngoặc và được truyền dẫn mysqldumpvào grepthành mysql, nó hoạt động. Cảm ơn một lần nữa cho giải pháp của bạn, nó tốt.
Rolf

5
Điều này là thiếu các ràng buộc khóa ngoại; Tôi đã thêm một tập lệnh bash ở đây dựa trên câu trả lời của bạn: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger

thật là thông minh!
zx1986

25

Từ câu trả lời này ,

hành hình:

  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;

Điều này làm giảm các bảng từ cơ sở dữ liệu hiện đang sử dụng. Bạn có thể thiết lập cơ sở dữ liệu hiện tại bằng cách sử dụng use.


Hoặc nếu không, câu trả lời được chấp nhận của Dion đơn giản hơn, ngoại trừ bạn cần thực hiện hai lần, lần đầu tiên để có được truy vấn và lần thứ hai để thực hiện truy vấn. Tôi đã cung cấp một số đánh dấu ngớ ngẩn để thoát các ký tự đặc biệt trong tên db và bảng.

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

Giải pháp ngắn gọn và sạch sẽ. Cách tốt hơn so với thủ tục thay thế.
Rafael Renan Pacheco

16

Đây là một giải pháp dựa trên con trỏ. Loại dài nhưng hoạt động như một lô SQL duy nhất:

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
Đẹp, nhưng nó không xử lý các khóa nước ngoài không may.
Timmmm

11

Bạn có thể làm:

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

Sau đó chạy các truy vấn được tạo. Họ sẽ bỏ mọi bảng duy nhất trên cơ sở dữ liệu hiện tại.

Đây là một số trợ giúp về drop tablelệnh.


Câu trả lời ở trên giả định rằng nó ||được đặt là toán tử ghép. Cụ thể hơn, chế độ SQL SQL chứa PIPES_AS_CONCAT. Tham khảo: dev.mysql.com/doc/refman/5.0/vi/ Từ
Ionuț G. Stan

@Iovy: tuyệt! cảm ơn đã chỉ ra rằng Đã sửa lỗi mẫu mã để sử dụng concatthay vì||
Pablo Santa Cruz

9

Tôi đã đưa ra sửa đổi này trên câu trả lời của Dion Truter để làm cho nó dễ dàng hơn với nhiều bảng:

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

Điều này trả về toàn bộ điều trong một trường, vì vậy bạn có thể sao chép một lần và xóa tất cả các bảng (sử dụng Copy Field Content (unquoted)trong Workbench). Nếu bạn có RẤT NHIỀU bảng, bạn có thể đạt một số giới hạn GROUP_CONCAT(). Nếu vậy, hãy tăng biến len tối đa (và max_allowed_packet, nếu cần).


SET GROUP_CONCAT_MAX_LEN là mẹo tôi cần. Tôi đã có một kịch bản đang hoạt động, nhưng luôn thất bại lần đầu tiên với một số tên bảng bị cắt ngắn, và sau đó kết thúc thành công khi chạy lần thứ hai. Cảm ơn!
dualmon

8

Một lớp lót để thả tất cả các bảng từ cơ sở dữ liệu đã cho:

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

Chạy này sẽ loại bỏ tất cả các bảng từ cơ sở dữ liệu DATABASE_NAME.

Và một điều tốt đẹp về điều này là tên cơ sở dữ liệu chỉ được viết rõ ràng một lần.


1
điều này hiệu quả với tôi nhưng, tôi đã phải thay thế -i bằng -I trên macOS High Sierra
Ali Selcuk

1
Cảm ơn @AliSelcuk. Cả -i và -I đều hoạt động với tôi trên Ubuntu, vì vậy tôi sẽ đổi nó thành -I để nó cũng hoạt động với macOS.
mgershen

1
Rất hữu ích, cảm ơn bạn! Tôi đã phải chuyển mật khẩu bằng cách sử dụng -pPASSWORD (không có khoảng cách giữa -p và PASSWORD) cho cả hai lệnh mysql
Mike

8

Googling về chủ đề luôn đưa tôi đến câu hỏi SO này vì vậy đây là mã mysql hoạt động xóa BÓNG bảng và khung nhìn:

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

6

Đây là một cách tự động để làm điều này thông qua một tập lệnh bash:

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

Thực sự thích giải pháp này nhưng tôi không thấy cách sử dụng biến chủ. Nó dường như không được sử dụng trong bất kỳ cuộc gọi mysql nào trong vòng lặp for.
Matthew Zackschewski

1
Xin lỗi, bỏ lỡ đặt nó trong lệnh, cập nhật nó.
kfox

5

Nếu trong linux (hoặc bất kỳ hệ thống nào khác hỗ trợ đường ống, echo và grep), bạn có thể làm điều đó với một dòng:

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;

Tôi biết đây là một câu hỏi cũ, nhưng tôi nghĩ phương pháp này nhanh và đơn giản.


2

Trong php nó dễ như:

$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');

Chỉ cần nhớ thay đổi YOUDB thành tên cơ sở dữ liệu của bạn và rõ ràng là người dùng / vượt qua.


2

Trong hệ vỏ Linux như 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"

Điều này sẽ tạo ra các lệnh, sau đó ngay lập tức chuyển chúng sang phiên bản máy khách thứ 2 sẽ xóa các bảng.

Tất nhiên, bit thông minh được sao chép từ các câu trả lời khác ở đây - Tôi chỉ muốn một lớp lót có thể sao chép và dán (ish) để thực sự làm công việc mà OP muốn.

Tất nhiên lưu ý rằng bạn cũng sẽ phải đặt thông tin đăng nhập của mình (hai lần) vào các lệnh mysql này, trừ khi bạn có thiết lập bảo mật rất thấp. (hoặc bạn có thể bí danh lệnh mysql của bạn để bao gồm các khoản tín dụng của bạn.)


2

Chỉ cần đặt ở đây một số nhận xét hữu ích được thực hiện bởi Jonathan Watt để thả tất cả các bảng

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

Nó giúp tôi và tôi hy vọng nó có thể hữu ích


2

Thả tất cả các bảng từ cơ sở dữ liệu với một dòng duy nhất từ ​​dòng lệnh:

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]

Trong đó [user_name], [password], [host_name] và [database_name] phải được thay thế bằng dữ liệu thực (người dùng, mật khẩu, tên máy chủ, tên cơ sở dữ liệu).


1

Đây là một bài viết khá cũ, nhưng không có câu trả lời nào ở đây thực sự trả lời câu hỏi theo ý kiến ​​của tôi, vì vậy tôi hy vọng bài viết của tôi sẽ giúp được mọi người!

Tôi tìm thấy giải pháp này cho một câu hỏi khác thực sự tốt cho tôi:

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

Điều đó thực sự sẽ làm trống tất cả các bảng của bạn trong cơ sở dữ liệu DB_NAMEvà không chỉ hiển thịTRUNCATE dòng lệnh.

Hi vọng điêu nay co ich!


Hữu ích nhưng nó không thực sự trả lời câu hỏi.
jrosell

1

Dựa trên câu trả lời của @Dion Truter và @Wade Williams, tập lệnh shell sau sẽ bỏ tất cả các bảng, sau lần đầu tiên hiển thị nội dung sắp chạy và cho bạn cơ hội hủy bỏ bằng 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

Giải pháp này dựa trên câu trả lời @SkyLeach nhưng với sự hỗ trợ của việc thả các bảng có khóa ngoại.

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
DB="your database name" \
    && mysql $DB < "SET FOREIGN_KEY_CHECKS=0" \
    && mysqldump --add-drop-table --no-data $DB | grep 'DROP TABLE' | grep -Ev "^$" | mysql $DB \
    && mysql $DB < "SET FOREIGN_KEY_CHECKS=1"

0

Đơn giản và rõ ràng (có thể).

Có thể không phải là một giải pháp ưa thích, nhưng điều này đã làm việc và tiết kiệm thời gian của tôi.

Đã làm việc cho phiên bản Máy chủ: 5.6,38 Máy chủ Cộng đồng MySQL (GPL)

Các bước tôi làm theo:

 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

Vỏ 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> 

nhập mô tả hình ảnh ở đây


-1

Tôi sử dụng như sau với máy chủ 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!!!!')

Thay thế Your_DATABASE bằng tên của cơ sở dữ liệu của bạn hoặc xóa toàn bộ câu lệnh IF (tôi thích sự an toàn được thêm vào).


-7

Giải pháp tốt nhất cho tôi cho đến nay

Chọn Cơ sở dữ liệu -> Nhấp chuột phải -> Nhiệm vụ -> Tạo tập lệnh - sẽ mở trình hướng dẫn để tạo tập lệnh. Sau khi chọn đối tượng trong tùy chọn Scripting, nhấp vào Nút nâng cao . Trong "Script DROP and CREATE", chọn Script DROP .

Chạy script.


Nó gần như hoạt động nhưng tôi nhấp vào nút màu xanh lá cây trước nút màu xanh và tôi nhận được một hộp bên trái và tôi nhấp vào hủy nhưng sau đó tôi uống cà phê của tôi và quên nó.
Rolf

Bạn thậm chí có thể giải thích nơi bạn nhấp? Có công cụ nào liên quan đến việc này không?
Nico Haase
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.