是否存在在一次操作中截断数据库中所有表的查询(命令)?我想知道我是否可以用一个查询做到这一点。


当前回答

给@Mathias Bynens的回答补充一点。当我运行这个时,我得到了一个错误,因为外键检查

mysql -Nse 'SHOW TABLES' <database_name> | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; DROP TABLE $table" <database_name>; done

如果数据库中有视图,则返回一个错误。我必须通过drop view <view_name>手动清除视图;

其他回答

如果使用SQL server 2005,有一个隐藏的存储过程,允许您对数据库中的所有表执行一个或一组命令。下面是如何用这个存储过程调用TRUNCATE TABLE:

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

这里有一篇很好的文章进一步阐述。

然而,对于MySql,你可以使用mysqldump并指定——add-drop-tables和——no-data选项来删除和创建所有忽略数据的表。是这样的:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]

Mysqldump使用指南

给@Mathias Bynens的回答补充一点。当我运行这个时,我得到了一个错误,因为外键检查

mysql -Nse 'SHOW TABLES' <database_name> | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; DROP TABLE $table" <database_name>; done

如果数据库中有视图,则返回一个错误。我必须通过drop view <view_name>手动清除视图;

由battousaix的Ans是完美的! 我只是使用了他的答案,并创建了截断数据库表的最终工作命令。

mysql -P 3306 -h YOUR_HOST_HERE -u YOUR_USERNAME_HERE -pYOUR_PASSWORD_HERE -Nse 'show tables' DATABASE_NAME |,同时读取表;-h YOUR_HOST_HERE -u your_username - here -pYOUR_PASSWORD_HERE -e "SET FOREIGN_KEY_CHECKS = 0;截断表$ DATABASE_NAME完成

上面的命令将完美地工作于MySQL服务器。

而且,它也包括在内。

设置foreign_key_checks = 0

这里,我知道这里

   SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('databasename1','databasename2');

如果不能删除或更新父行:外键约束失败

如果存在外键指向您试图删除/截断的表的表,就会发生这种情况。

在截断表之前,你需要做的是:

SET FOREIGN_KEY_CHECKS=0;

截断您的表并将其更改回

SET FOREIGN_KEY_CHECKS=1; 

使用这段PHP代码 $truncate = mysql_query("SELECT Concat(' truncate TABLE ',table_schema,'. "',TABLE_NAME, ';')作为table_query FROM INFORMATION_SCHEMA。table where table_schema in ('databasename')"); 而($ truncateRow =作用(截断)美元){ mysql_query()美元truncateRow [' tables_query ']); } ? > 查看详情 链接

这是我的变体有'一个语句截断'他们所有'。

首先,我为我的辅助存储过程使用了一个名为“util”的单独数据库。我的存储过程截断所有表的代码是:

DROP PROCEDURE IF EXISTS trunctables;
DELIMITER ;;
CREATE  PROCEDURE trunctables(theDb varchar(64))
BEGIN
    declare tname varchar(64);
    declare tcursor CURSOR FOR 
    SELECT table_name FROM information_schema.tables WHERE table_type <> 'VIEW' AND table_schema = theDb;
    SET FOREIGN_KEY_CHECKS = 0; 
    OPEN tcursor;
    l1: LOOP
        FETCH tcursor INTO tname;
        if tname = NULL then leave l1; end if;
        set @sql = CONCAT('truncate `', theDB, '`.`', tname, '`');
        PREPARE stmt from @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP l1;
    CLOSE tcursor;
    SET FOREIGN_KEY_CHECKS = 1; 
END ;;
DELIMITER ;

在util数据库中有了这个存储过程后,可以像这样调用它

call util.trunctables('nameofdatabase');

现在正好是一个声明:-)