MySQL DROP all tables, ignoring foreign keys
是否有一个好的简单方法可以从MySQL数据库中删除所有表,忽略其中可能存在的任何外键约束?
我发现了一套有用的液滴生成的报表进行调整,所以:
1 2 3 |
注:本表不执行一滴,它只是给你一个清单。你将需要切割和粘贴到您的SQL引擎输出到执行他们。
"RESTRICT and CASCADE are permitted to make porting easier. In MySQL 5.5, they do nothing."
因此,在降阶的语句:如果你需要工作
1 |
这将禁用完整性检查是指,当你做你需要表演一滴,你将要检查与复位键
1 |
1 2 3 |
注:使用MySQL的SELECT输出到CAN B选项的帮助。
从http://www.devdaily.com /博客/邮件/ MySQL /删除MySQL表中的任何阶对外键:
1 2 3 4 5 |
(注这是回答如何禁用对外重点检查为了可以把表中的任意命令。它不回答如何自动生成语句删除表的所有现有的表和执行他们在单一的脚本。珍妮不回答。)
这里是surlydre这样的存储过程修改外键是忽略的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | 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`; |
方法包括一个以上的工作比这一个更afaict…
1 2 |
从这个回答,
执行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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; |
本表从数据库中删除正在使用。你可以使用
或其他公认的答案,席琳的是简单的,除非你需要它去执行两次,第一和第二个查询,执行查询。我提供一些愚蠢的反向调整到转义特殊字符在数据库和表的名称。
1 2 3 |
这是一个基于游标的解决方案。但作品作为一个单一的解决如:SQL批处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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`; |
你可以做的:
然后运行生成的查询。他们想要一个单表的滴流的数据库。
这里是一些帮助在
我来这一truter改造在Dion的答案,使它更容易有许多表:
1 2 3 4 5 6 7 8 9 10 |
这整个事情在一场归来,所以你可以一次删除所有的表和复制(使用
如果在Linux(或任何其他系统,支持管道,回声和grep)你可以做它与一号线:
1 2 3 4 |
我知道这是一个老问题,但我认为这是一个快速和简单的方法。
这是通过在一个自动的方式来做:A bash脚本
1 2 3 4 5 6 7 8 9 10 11 12 | 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 -u$user -p$password $dbName -e"show tables" | grep -v Tables_in` ; do echo $i && mysql -u$user -p$password $dbName -e"SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done |
从给定数据库中删除所有表的一行程序:
1 | echo"DATABASE_NAME"| xargs -I{} sh -c"mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}" |
运行此命令将删除数据库名称中的所有表。
这方面的一个好处是数据库名只显式地写一次。
在AS AS:PHP易其
1 2 3 4 5 6 7 8 9 10 11 12 13 | $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,显然用户/护照。
在一个Linux bash / zsh壳样:
1 2 3 4 5 6 | 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" |
这将生成的命令,然后他们立即管A第二客户端实例这将删除的表。
一位很聪明的课程从这里copied其他答案我只是想复制和可粘贴到一个衬垫(ISH)的工作是做的手术需要。
当然,你要注意要把你的凭据(两次)在MySQL的命令进行的,太,除非你有一个非常低的安全设置。(或你可以包括你的MySQL命令别名,考查了。)
googling on topic总是让我想到这个问题,所以这里是使用mysql代码来删除表和视图:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | 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`; |
在这里写下乔纳森·瓦特的一些有用的评论来删除所有的表格
1 2 3 | 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 |
它对我有帮助,我希望它能有用
这是一个漂亮的老邮件,但没有答案来回答这样的问题,真的在我的意见,所以我希望我的邮件要帮助人民!
我发现这真的是一个解决方案在我的好作品。
1 |
这将是空的所有的表在数据库
希望它帮助!
在@dion truter和@wade williams给出答案的基础上,下面的shell脚本将删除所有表,首先显示它将要运行的内容,然后让您有机会使用ctrl-c中止。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #!/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} |
简单明了(可能是)。
也许不是一个很好的解决办法,但这对我很有帮助,挽救了我的一天。
服务器版本:5.6.38 MySQL Community Server(GPL)
我遵循的步骤:
1 2 3 4 5 6 |
MySQL外壳
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | 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> |
此解决方案基于@skyligh answer,但支持使用外键删除表。
1 2 3 4 |
1 2 3 4 |
我用下面的一个MSSQL服务器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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!!!!') |
replace的_数据库的数据库的名称或删除整个if语句(我喜欢添加安全)。
迄今为止对我来说最好的解决方案
选择数据库->右键单击->任务->生成脚本-将打开生成脚本的向导。在"设置脚本"选项中选择对象后,单击"高级"按钮。在"脚本删除并创建"下,选择"脚本删除"。
运行脚本。