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


当前回答

溶液(1)

mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;

溶液2)

- Export only structure of a db
- drop the database
- import the .sql of structure 

——编辑----

earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result

其他回答

删除(即删除表格)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done

截断(即空表)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done

我发现最简单的方法是像下面这样做,只需用自己的表名替换表名。重要的是确保最后一行永远是 设置FOREIGN_KEY_CHECKS = 1;

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;

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

首先,我为我的辅助存储过程使用了一个名为“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');

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

我发现TRUNCATE表..外键约束有问题,即使在NOCHECK约束ALL之后,所以我使用DELETE FROM语句代替。这意味着身份种子不会被重置,你总是可以添加一个DBCC CHECKIDENT来实现这一点。

我使用下面的代码打印到消息窗口的sql截断数据库中的所有表,然后运行它。这只会让犯错变得更难。

EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''

由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