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


当前回答

下面的查询将为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

其他回答

MS SQL Server 2005+(删除打印以实际执行…)

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
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
<?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();

?>

这是我用来清除一个表的代码片段。只需更改$conn info和TABLE_NAME。

这里,我知道这里

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

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;