mysql drop 外键_MySQL DROP所有表,忽略外键

是否有一个很好的简单方法从MySQL数据库中删除所有表,忽略可能存在的任何外键约束?

#1楼

这是一个基于游标的解决方案。 有点冗长但作为单个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楼

这里修改了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`;

#3楼

以下是通过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 -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

#4楼

我提出了对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';

这会在一个字段中返回整个内容,因此您可以复制一次并删除所有表(使用Workbench中的Copy Field Content (unquoted) )。 如果你有很多表,你可能会对GROUP_CONCAT()有一些限制。 如果是这样,请增加max len变量(如果需要,还增加max_allowed_packet )。

#5楼

在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更改为数据库的名称,显然是用户/传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值