在一个命令中截断 MySQL 数据库中的所有表?

Posted

技术标签:

【中文标题】在一个命令中截断 MySQL 数据库中的所有表?【英文标题】:Truncate all tables in a MySQL database in one command? 【发布时间】:2010-12-27 03:15:54 【问题描述】:

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

【问题讨论】:

截断所有表?你的意思是截断数据库中所有表的所有列?这是什么查询语言? (例如 SQL、mysql、Oracle、Postgres 等) 我不确定我是否会推荐这样做,因为您很容易陷入困境。您是否有理由不能只编写截断脚本并运行脚本? 感谢 4 的回复,但唯一的原因是没有编写脚本,因为时间不够,所以想到在 mysql 中运行查询 ya 它在 mysql..and 查询意味着类似于 truncate table table_name..这里我想在一个查询中截断我的数据库中所有表的所有行 您可以将 Information_Schema 与光标一起使用。不确定 MySql,但它应该支持 Information_Schema.Tables 【参考方案1】:

删除(即删除表格)

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

【讨论】:

是的,干净,ty。但是您可能需要使用 -uUSER -pPASSWORD 运行它。此外,如果您有 FK 而没有在级联上删除,您可能需要多次运行它。 如果遇到“无法删除或更新父行:外键约束失败”等外键问题,请务必通过修改命令禁用外键检查如下:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME 虽然不需要循环 mysql 客户端。像这样把它从循环中取出:mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME @TylerCollier 你需要一个.my.cnf 基于上面的答案和 cmets,因为它们对我来说没有按预期工作,所以我制作了一个简单的 bash 脚本,您可以使用它。您可以在以下位置找到它:gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d【参考方案2】:

截断Mysql实例上的多个数据库表

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

使用查询结果截断表

注意: 可能你会得到这个错误:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

如果有表的外键引用您尝试删除/截断的表,就会发生这种情况。

在截断表格之前您需要做的就是:

SET FOREIGN_KEY_CHECKS=0;

截断表格并将其更改回

SET FOREIGN_KEY_CHECKS=1;

【讨论】:

如果您有数据库的用户名和密码,并且不想在 shell 中明显地键入它们,这可能是最好的解决方案。 赞成,因为此解决方案只需要 DB 访问权限,而不需要 SSH 访问权限。此外,它独立于操作系统。 @mastazi 我有几个问题: 1. “table_schema”代表什么?它是从架构名称中获得的吗? 2.TABLE_NAME 代表什么?它代表应该删除的表吗? 3.我应该把应该删除的表写在“('db1_name','db2_name')”之类的命令中吗? @Ahmed 唯一需要的替换是您必须将 db1_name 和 db2_name 替换为您的数据库名称。然后您必须复制此查询的结果,并将它们粘贴为新的 mysql 查询并执行它们。 INFORMATION_SCHEMA 是一个内置模式,它预先安装在每个 MySQL 安装中,并保存有关您的数据库的信息,不要触摸它,否则您的 MySQL 将开始行为不端:-) table_schema 和 table_name 是名为“TABLES”的表的列information_schema 如何“使用查询结果”截断表?【参考方案3】:

这样使用phpMyAdmin:

数据库视图=>检查所有(表)=>空

如果您想忽略外键检查,可以取消选中以下框:

[ ] 启用外键检查

您需要运行至少 4.5.0 或更高版本才能获得此复选框。

它不是 MySQL CLI-fu,但嘿,它有效!

【讨论】:

谁说我们没有?这个答案显然对人们有用;它有帮助。 如果您有父子数据库架构,这将不起作用。 外键约束失败。 @BrianHannay 编辑了答案以添加有关禁用外键检查的复选框的注释。 @BrianHannay 它是在 2015 年 6 月在 PMA 4.5.0 中添加的。我找到了 changelog 和 original issue【参考方案4】:

MS SQL Server 2005+(删除 PRINT 以便实际执行...)

EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''

如果您的数据库平台支持 INFORMATION_SCHEMA 视图,请获取以下查询的结果并执行它们。

SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

在 MySQL 上试试这个:

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES

在 Concat 中添加分号使其更易于使用,例如从 mysql 工作台中。

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES

【讨论】:

hi..thanks for d reply 我试过这个查询,但似乎没有用..是类似于截断表 table_name 的东西,我可以用于我的数据库中的所有表.. 我忘了 MySQL 不直接支持“+”运算符。假设这是错误,我添加了上面的 CONCAT() 示例。如果您仍然收到错误消息,请分享实际的错误消息。 此查询有效,但如果我有一个 diff 数据库名称,例如 devang..是我的数据库名称,所以如果我根据您的上述查询使用它会引发 foll 错误。表 'devang.TABLES'不存在 啊。 INFORMATION_SCHEMA 是一个存在于活动数据库中的视图。如果您更改数据库,则视图将针对该数据库执行。更改数据库时无需修改查询。只需按照以下步骤操作:1)更改活动数据库。 2)运行脚本。 3) 复制结果 4) 将结果粘贴回编辑器 5) 执行结果。活动数据库中的所有表现在都被截断了。 当心!这会选择所有数据库中的所有表(甚至是那些不在当前数据库中的表。MySQL 示例不起作用,但在我的情况下,它返回 293 行(表)而不是 66 行。想象一下数据丢失...... 【参考方案5】:

我发现这会删除数据库中的所有表:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME

如果您受到托管解决方案的限制(无法删除整个数据库),则很有用。

我对其进行了修改以截断表格。 mysqldump 没有“--add-truncate-table”,所以我这样做了:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME

为我工作 --edit,修正最后一个命令中的错字

【讨论】:

【参考方案6】:
SET FOREIGN_KEY_CHECKS = 0;

SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM   information_schema.tables
WHERE  table_type   = 'BASE TABLE'
  AND  table_schema IN ('db1_name','db2_name');

PREPARE stmt FROM @str;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1;

【讨论】:

如果您想使用当前数据库(从而使此代码可移植),请将SELECT 中的最后一个条件更改为:AND table_schema = DATABASE(); 它不会为我截断。 MySQL 5.7.25 在 MySQL 5.7.12 (Aurora MySQL 2.7.2) 上进行测试,这只会截断 SELECT 查询中的最后一个表。 @str 似乎没有将所有表连接在一起。【参考方案7】:

我发现像下面的代码那样做最简单,只需用你自己的替换表名。 重要确保最后一行总是 SET 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;

【讨论】:

您不必重复 SET FOREIGN_KEY_CHECKS=0;在将模式标记为 0 的起始行的每个 TRUNCATE 命令之后【参考方案8】:

这将打印截断所有表的命令:

SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');

【讨论】:

【参考方案9】:
    要截断一个表,必须从其他表中删除映射到该表中列的外键约束(实际上是在特定 DB/Schema 中的所有表上)。 因此,必须首先删除所有外键约束,然后进行表截断。 (可选)使用优化表(在 mysql、innodb 引擎 esp 中)在数据截断后将使用的数据空间/大小回收给 OS。

    执行数据截断后,在同一张表上再次创建相同的外键约束。 请参阅下面的脚本,该脚本将生成执行上述操作的脚本。

    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    UNION
    SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';
    

现在,运行生成的 Db Truncate.sql 脚本

好处。 1)回收磁盘空间 2) 不需要删除和重新创建具有相同结构的 DB/Schema

缺点。 1) FK 约束应为表中约束名称中包含“FK”的名称。

【讨论】:

【参考方案10】:

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

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

Here 是一篇好文章,进一步阐述。

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

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

mysqldump usage guide from dev.mysql

【讨论】:

【参考方案11】:

使用它并形成查询

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';

现在用这个来使用这个查询

mysql -u username -p </path/to/file.sql

如果你遇到这样的错误

ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint

最简单的方法是在文件顶部添加这一行

SET FOREIGN_KEY_CHECKS=0;

这表示我们不想在浏览此文件时检查外键约束。

它将截断数据库 db1 和 bd2 中的所有表。

【讨论】:

数据库名称应该在 qoutes 中【参考方案12】:

这是我的变体,有“一条语句来截断所有”。

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

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

【讨论】:

这是唯一可靠地为我工作的可编写脚本的解决方案。【参考方案13】:

这里我知道

   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, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");

    while($truncateRow=mysql_fetch_assoc($truncate))

        mysql_query($truncateRow['tables_query']);

    
?>

在此处查看详细信息 link

【讨论】:

【参考方案14】:

没有。没有一个命令可以一次截断所有 mysql 表。您必须创建一个小脚本来逐个截断表格。

参考:http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

【讨论】:

【参考方案15】:

这对我有用。相应地更改数据库、用户名和密码。

mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD

【讨论】:

【参考方案16】:

这是一个应该截断本地数据库中所有表的过程。

如果它不起作用,请告诉我,我将删除此答案。

未经测试

CREATE PROCEDURE truncate_all_tables()
BEGIN

   -- Declare local variables
   DECLARE done BOOLEAN DEFAULT 0;
   DECLARE cmd VARCHAR(2000);

   -- Declare the cursor
   DECLARE cmds CURSOR
   FOR
   SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;

   -- Declare continue handler
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

   -- Open the cursor
   OPEN cmds;

   -- Loop through all rows
   REPEAT

      -- Get order number
      FETCH cmds INTO cmd;

      -- Execute the command
      PREPARE stmt FROM cmd;
      EXECUTE stmt;
      DROP PREPARE stmt;

   -- End of loop
   UNTIL done END REPEAT;

   -- Close the cursor
   CLOSE cmds;

END;

【讨论】:

花了我很多时间来弄清楚为什么这不起作用。然后对此电子邮件线程的评论有所帮助:forums.mysql.com/read.php?61,116597,219343#msg-219343 - 供参考:“不幸的是,它看起来像准备语句不能在游标中使用。来自手册:dev.mysql.com/doc/refman/6.0/en/…"【参考方案17】:

我发现 TRUNCATE TABLE .. 在外键约束方面存在问题,即使在 NOCHECK CONSTRAINT 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'''

【讨论】:

【参考方案18】:

我知道这不完全是一个命令,但可以通过以下步骤在 phpMyAdmin 中实现所需的结果:

    选择(全部)要删除的表(全部选中) 从“With selected:”列表中选择“Drop”/“Truncate” 在确认页面(“您真的要:”)复制查询(所有内容都带有红色背景) 在顶部点击 SQL 并写下:“SET FOREIGN_KEY_CHECKS=0;”然后粘贴之前复制的查询 点击“开始”

我们的想法是快速从数据库中获取所有表(您只需 5 秒和 2 次单击即可完成此操作),但首先禁用外键检查。无需 CLI,无需删除数据库并再次添加。

【讨论】:

使用现成的 GUI 来完成这项工作非常方便,而且确实可以解决问题。【参考方案19】:

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

mysql -P 3306 -h YOUR_HOST_HERE -u YOUR_USERNAME_HERE -pYOUR_PASSWORD_HERE -Nse 'show tables' DATABASE_NAME | while read table; do mysql -P 3306 -h YOUR_HOST_HERE -u YOUR_USERNAME_HERE -pYOUR_PASSWORD_HERE -e "SET FOREIGN_KEY_CHECKS = 0; truncate table $table" DATABASE_NAME; done

上面的命令对于 MySQL 服务器来说是完美的。

此外,它也包括在内。

SET FOREIGN_KEY_CHECKS = 0

【讨论】:

【参考方案20】:

我不确定,但我认为有一个命令可以将数据库架构复制到新数据库中,完成此操作后,您可以删除旧数据库,之后您可以再次将数据库架构复制到旧名。

【讨论】:

mysqldump -uuser -ppassword --no-data salesLeadsBrittany >salesLeadsT​​emplate.sql 这将创建一个仅包含模式的 sql 文件(无数据)。您可以在此命令后删除数据库,并可以通过导入架构重新创建数据库。【参考方案21】:
TB=$( mysql -Bse "show tables from DATABASE" );
for i in $TB;
    do echo "Truncating table $i";
    mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.$i; set foreign_key_checks=1; set unique_checks=1";
    sleep 1;
done

--

大卫,

感谢您花时间格式化代码,但这是应该的应用方式。

-库尔特

在 UNIX 或 Linux 机器上:

确保您在 bash shell 中。这些命令将从命令行运行,如下所示。

注意:

我将我的凭据存储在我的 ~/.my.cnf 文件中,因此我不需要在命令行中提供它们。

注意:

cpm 是数据库名称

我只展示了每个命令的一小部分结果。

找到你的外键约束:

klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
             from information_schema.referential_constraints
             where constraint_schema = 'cpm'
             order by referenced_table_name"
    approval_external_system 依赖于approval_request 地址取决于客户 customer_identification 取决于客户 external_id 取决于客户 凭据取决于客户 email_address 取决于客户 approval_request 取决于客户 customer_status 取决于客户 customer_image 取决于客户

列出表格和行数:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 297
 2  approval_external_system    0
 3  approval_request    0
 4  country 189
 5  credential  468
 6  customer    6776
 7  customer_identification 5631
 8  customer_image  2
 9  customer_status 13639

截断你的表:

klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in $TB; do echo "Truncating table $i"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.$i; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
    截断表地址 截断表approval_external_system 截断表approval_request 截断表国家 截断表凭据 截断表客户 截断表 customer_identification 截断表 customer_image 截断表 customer_status

验证它是否有效:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 0
 2  approval_external_system    0
 3  approval_request    0
 4  country 0
 5  credential  0
 6  customer    0
 7  customer_identification 0
 8  customer_image  0
 9  customer_status 0
10  email_address   0

在 Windows 机器上:

注意:

cpm 是数据库名称

C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm

【讨论】:

【参考方案22】:

以下 MySQL 查询本身将生成一个查询,该查询将截断给定数据库中的所有表。它绕过了 FOREIGN 键:

SELECT CONCAT(
         'SET FOREIGN_KEY_CHECKS=0; ',
         GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
         'SET FOREIGN_KEY_CHECKS=1;'
       ) as dropAllTablesSql
FROM   ( SELECT  Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
         FROM    INFORMATION_SCHEMA.TABLES
         WHERE   table_schema = 'DATABASE_NAME' ) as queries

【讨论】:

【参考方案23】:
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql

【讨论】:

这实际上是一个非常好的解决方案:)【参考方案24】:

解决方案 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

【讨论】:

这似乎只返回第一个表:TRUNCATE table1,而忘记了所有其他表。 这个解决方案绝对是疯了。我不知道为什么它没有得到投票。可能是因为我的错误已被编辑。 您可能会收到安全文件私有错误。这是一项安全功能,仅允许写入特定目录。在 MySQL 中输入以下命令:show variables LIKE "secure_file_priv";它将向您显示可以写入的文件夹。就我而言,它是/var/lib/mysql-files/。使用它而不是 /tmp - 只需确保您正在写入的文件名不在该文件夹中。或者,您可以在 [mysql] 块中的 my.cnf 中禁用它,方法是输入以下行:secure-file-priv='' 并重新启动 MySQL。但是,如果您这样做,您将关闭安全级别。【参考方案25】:

我们可以像下面这样写一个 bash 脚本

truncate_tables_in_mysql() 
    type mysql >/dev/null 2>&1 && echo "MySQL present." || sudo apt-get install -y mysql-client
    
    tables=$(mysql -h 127.0.0.1 -P $MYSQL_PORT -u $MYSQL_USER  -p$MYSQL_PASSWORD -e "USE $BACKEND_DATABASE;    
SHOW TABLES;")
    tables_list=($tables)
    
    query_string="USE $BACKEND_DATABASE; SET FOREIGN_KEY_CHECKS = 0;"
    for table in "$tables_list[@]:1"
    do
        query_string="$query_string TRUNCATE TABLE \`$table\`; "
    done
    query_string="$query_string SET FOREIGN_KEY_CHECKS = 1;"
    
    mysql -h 127.0.0.1 -P $MYSQL_PORT -u $MYSQL_USER -p$MYSQL_PASSWORD -e "$query_string"

您可以将环境变量替换为您的 MySQL 详细信息。使用一个命令,您可以截断数据库中的所有表。

【讨论】:

【参考方案26】:

PHP 单条命令:

php -r '$d="PUT_YOUR_DB_NAME_HERE"; $q="show tables"; $dt="drop table"; exec("mysql -Nse \"$q\" $d", $o); foreach($o as $e) `mysql -e "$dt $e" $d`;'

执行的 PHP 脚本:

$d="PUT_YOUR_DB_NAME_HERE"; 
$q="show tables"; 
$dt="drop table"; 

exec("mysql -Nse \"$q\" $d", $o); 

foreach($o as $e)
  `mysql -e "$dt $e" $d`;

【讨论】:

【参考方案27】:

我发现顶部answer 很棒。但是,当您拥有经过身份验证的 MySQL 数据库用户时,它会失败。

这是建立在我链接的最佳答案之上的解决方案。此解决方案可以安全地处理身份验证,而无需:

输入每个表的密码 担心您的密码在某处泄露 对其他 MySQL cnf 文件 (~/.my.cnf) 的副作用有关这些文件的作用的更多详细信息,请查看此答案底部的资源部分。

1。创建本地 .my.cnf 文件

vi .temp.my.cnf
[client]
user=<admin_user_goes_here>
password=<admin_password_goes_here>

2。截断或删除所有表

2.A 截断所有表(仅限空)

mysql --defaults-extra-file=.temp.my.cnf -Nse 'show tables' <db_name_goes_here> | while read table; do mysql --defaults-extra-file=.temp.my.cnf -e "truncate table $table" <db_name_goes_here>; done

2.B 删除所有表(完全删除)

mysql --defaults-extra-file=.temp.my.cnf -Nse 'show tables' <db_name_goes_here> | while read table; do mysql --defaults-extra-file=.temp.my.cnf -e "drop table $table" <db_name_goes_here>; done

3。清理

删除您的用户密码文件

rm -rf .temp.my.cnf

资源:

https://rtcamp.com/tutorials/mysql/mycnf-preference/ https://dev.mysql.com/doc/refman/8.0/en/option-files.html https://dev.mysql.com/doc/refman/8.0/en/option-file-options.html#option_general_defaults-extra-file

【讨论】:

【参考方案28】:

一个想法可能是删除并重新创建表?

编辑:

@Jonathan Leffler:是的

其他建议(或者您不需要截断所有表格的情况):

为什么不创建一个基本的存储过程来截断特定的表

CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO

【讨论】:

这会丢失表上的所有约束、权限、视图等 - 这是相当麻烦的。 您可以进行删除,然后重新设置所有表的种子而不是截断。我认为降价是出于沮丧。只需恢复您的备份即可。【参考方案29】:
<?php
// connect to database
$conn=mysqli_connect("localhost","user","password","database");

// check connection
if (mysqli_connect_errno()) 
  exit('Connect failed: '. mysqli_connect_error());


// sql query
$sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);


// Print message
if ($sql === TRUE) 
  echo 'data delete successfully';

else 
 echo 'Error: '. $conn->error;


$conn->close();

?>

这是我用来清理表格的代码 sn-p。只需更改 $conn 信息和 TABLE_NAME。

【讨论】:

嘿,詹姆斯,我认为 OP 首先是在寻找一个单一的班轮....其次是一个命令,让所有表格一旦关闭并删除它们。这需要某种用户干预。谢谢你的帖子

以上是关于在一个命令中截断 MySQL 数据库中的所有表?的主要内容,如果未能解决你的问题,请参考以下文章

Navicat:截断表或者清空表后行数不为0

Navicat:截断表或者清空表后行数不为0

MS SQL:如果记录数超过 N,则执行截断

在 MySQL 中,删除似乎正在截断整个表

截断所有 MySql 表的 shell 脚本

存储过程是不是可以调用截断 veiw 表并将数据输入到 MySql 中的视图表中[关闭]