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?
Drop
từ menu thả xuống, bạn có thể bỏ chọn Foreign key check
hộp kiểm.
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?
Drop
từ menu thả xuống, bạn có thể bỏ chọn Foreign key check
hộp kiểm.
Câu trả lời:
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:
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.
"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
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 đỡ.
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.
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.)
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`;
_tableName
bằng một backquote. Nếu không, nó sẽ thất bại trên một số bảng như group
hoặc các từ khóa khác.
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
mysqldump
đến mysql
, mà không đi qua một tập tin?
mysqldump
vào grep
thà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.
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
Đâ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`;
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 table
lệnh.
||
đượ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ừ
concat
thay vì||
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).
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.
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`;
Đâ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
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.
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.
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.)
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
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).
Đâ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_NAME
và không chỉ hiển thịTRUNCATE
dòng lệnh.
Hi vọng điêu nay co ich!
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}
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
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"
Đơ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>
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).
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.