Làm thế nào để loại bỏ tất cả các bảng MySQL từ dòng lệnh?


29

Thông thường tôi mở Terminal.app và kết nối với cơ sở dữ liệu MySQL từ xa.

Sau đó, tôi sử dụng lệnh này để thả một bảng:

mysql> drop table [table name];

Nhưng cái tôi cần là dòng lệnh để thả tất cả các bảng trong cơ sở dữ liệu.

Nếu tôi sử dụng:

mysql> drop database [database name];

Tôi sẽ phá hủy hoàn toàn cơ sở dữ liệu và tôi sẽ không thể tạo lại bảng. Tôi có đúng không


Câu trả lời:


27

Bạn có thể bỏ cơ sở dữ liệu sau đó ngay lập tức tạo lại nó:

mysql> drop database [database name];
mysql> create database [database name];

Hoặc bạn có thể sử dụng một tập lệnh để thả từng bảng trong cơ sở dữ liệu.


ok, chỉ để chắc chắn: Tôi kết nối với cơ sở dữ liệu từ xa trong Terminal bằng dòng này: / Ứng dụng / MAMP / Thư viện / bin / mysql -h 80.54.554.10 -u adm_user -p my_db . Sau khi loại bỏ và tạo cơ sở dữ liệu như bạn nói, tôi sẽ cần thay đổi giá trị kết nối này hay chúng vẫn giữ nguyên?
Chefnelone

1
@chef - Bỏ tất cả các bảng và bỏ toàn bộ cơ sở dữ liệu không có tác dụng tương tự. Nếu bạn chỉ thả các bảng thì mọi quyền của cơ sở dữ liệu sẽ vẫn còn, nếu không bạn sẽ hủy / tạo lại cơ sở dữ liệu.
Nifle

10
@chefnelone: ​​Cẩn thận !!! Bỏ cơ sở dữ liệu cũng làm giảm các thủ tục được lưu trữ và các khung nhìn do người dùng xác định.
RolandoMySQLDBA

Khá rõ ràng cho tôi. Tôi sẽ đi với kịch bản để xóa từng bảng.
Chefnelone

1
nó hoàn toàn không an toàn, hãy xem các bình luận http://stackoverflow.com/a/12403742/1713660
vladkras

10

Bạn có thể thử lệnh sau:

mysqldump --no-data --add-drop-table DB_NAME | grep ^DROP | mysql -v DB_NAME

Hoặc là:

mysql --silent --skip-column-names -e "SHOW TABLES" DB_NAME | xargs -L1 -I% echo 'DROP TABLE `%`;' | mysql -v DB_NAME

DB_NAMETên cơ sở dữ liệu của bạn ở đâu . Thông tin cơ sở dữ liệu bạn có thể chỉ định trong ~/.my.cnfhoặc thêm chúng vào lệnh (ví dụ -uroot -proot).

Phương pháp này có một số ưu điểm so với việc bỏ và tạo cơ sở dữ liệu trong trường hợp người dùng cơ sở dữ liệu của bạn không có quyền bỏ nó.


1
Xác nhận ví dụ thứ hai, tuyệt vời. Thêm thông tin đăng nhập db dưới dạng các cờ bổ sung trước --silent-v/ --verbosetương ứng như sau:--user=username --password=password --host=host.name
tại đây

Ý tưởng tốt. Nhưng có một số vấn đề khi có chìa khóa nước ngoài. Tôi thêm | sort -rvào dòng ngược, nhưng vẫn không tương thích một số db.
Fancyoung

2

mysql -u USERHERE -pPASSWORDHERE --silent --skip-column-names -e "SHOW TABLES" DATABASENAMEHERE | xargs -L1 -I% echo 'SET FOREIGN_KEY_CHECKS = 0; DROP TABLE%;' | mysql -u USERHERE -pPASSWORDHERE -v DATABASENAMEHERE


2
Chào mừng bạn đến với Siêu người dùng! Trong khi điều này có thể trả lời câu hỏi, nó sẽ là một câu trả lời tốt hơn nếu bạn có thể giải thích tại sao nó lại như vậy. Chúng tôi đang tìm kiếm câu trả lời toàn diện, chất lượng cao cung cấp một số giải thích và bối cảnh. Đừng chỉ đưa ra một câu trả lời một dòng; giải thích tại sao câu trả lời của bạn là đúng, lý tưởng với trích dẫn. Câu trả lời không bao gồm giải thích có thể được gỡ bỏ. Ngoài ra, kiểm tra định dạng của bạn.
G-Man nói 'Phục hồi Monica'

Đừng quên đặt Foreign_key_checks = 1 sau khi thả bảng: xem stackoverflow.com/a/2873991/4306855 mysql -u USERHERE -pPASSWORDHERE --silent --skip-cột-name -e "SHOW TABLES" DATABASENAMEHERE | xargs -L1 -I% echo 'SET FOREIGN_KEY_CHECKS = 0; BẢNG DROP%; SET FOREIGN_KEY_CHECKS = 1; ' | mysql -u NGƯỜI DÙNG -pPASSWORDHERE -v DATABASENAMEHERE
toto21
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.