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


当前回答

下面的查询将为Mysql模式中的所有数据库表生成一个截断命令列表。(将dbSchemaName1替换为您的Db模式名。)

SELECT CONCAT('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN ('dbSchemaName1','dbSchemaName2');

复制查询结果(可能看起来像下面这样),并将截断命令列表粘贴到MySQL Worbench或您选择的查询命令工具中的SQL查询选项卡中:

TRUNCATE TABLE dbSchemaName1.table1;
TRUNCATE TABLE dbSchemaName1.table2;
TRUNCATE TABLE dbSchemaName1.table3;

注意:您可能会收到以下错误:

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

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

要解决在运行truncate命令之前关闭外键检查的问题:

SET FOREIGN_KEY_CHECKS=0;  -- turn off foreign key checks
TRUNCATE TABLE dbSchemaName1.table1;  -- truncate tables
TRUNCATE TABLE dbSchemaName1.table2;
TRUNCATE TABLE dbSchemaName1.table3;
SET FOREIGN_KEY_CHECKS=1;  -- turn on foreign key checks

其他回答

我知道这不是一个确切的命令,但预期的结果可以从phpMyAdmin通过以下步骤实现:

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

其思想是快速从数据库中获取所有表(只需5秒和2次单击),但首先禁用外键检查。不需要CLI,也不需要删除数据库并重新添加。

下面的查询将为Mysql模式中的所有数据库表生成一个截断命令列表。(将dbSchemaName1替换为您的Db模式名。)

SELECT CONCAT('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES WHERE table_schema IN ('dbSchemaName1','dbSchemaName2');

复制查询结果(可能看起来像下面这样),并将截断命令列表粘贴到MySQL Worbench或您选择的查询命令工具中的SQL查询选项卡中:

TRUNCATE TABLE dbSchemaName1.table1;
TRUNCATE TABLE dbSchemaName1.table2;
TRUNCATE TABLE dbSchemaName1.table3;

注意:您可能会收到以下错误:

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

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

要解决在运行truncate命令之前关闭外键检查的问题:

SET FOREIGN_KEY_CHECKS=0;  -- turn off foreign key checks
TRUNCATE TABLE dbSchemaName1.table1;  -- truncate tables
TRUNCATE TABLE dbSchemaName1.table2;
TRUNCATE TABLE dbSchemaName1.table3;
SET FOREIGN_KEY_CHECKS=1;  -- turn on foreign key checks

我们可以编写如下所示的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细节替换env变量。使用一个命令就可以截断一个DB中的所有表。

这里,我知道这里

   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 ']); } ? > 查看详情 链接

我发现最简单的方法是像下面这样做,只需用自己的表名替换表名。重要的是确保最后一行永远是 设置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;