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

whhtz7ly  于 2021-06-23  发布在  Mysql
关注(0)|答案(27)|浏览(387)

是否有一个查询(命令)在一次操作中截断数据库中的所有表?我想知道我是否可以用一个查询来完成这个任务。

cwdobuhd

cwdobuhd1#

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

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
ikfrs5lh

ikfrs5lh2#

没有。没有一个命令可以一次截断所有mysql表。您必须创建一个小脚本来逐个截断表。
裁判:http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html

xoshrz7s

xoshrz7s3#

如果使用SQLServer2005,则有一个隐藏的存储过程,允许您对数据库中的所有表执行一个或一组命令。这是你的电话 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]

来自dev.mysql的mysqldump使用指南

hc8w905p

hc8w905p4#

我知道这并不完全是一个命令,但是可以通过以下步骤在phpmyadmin中实现所需的结果:
选择(全部)要删除的表(全部选中)
从“with selected:”列表中选择“drop”/“truncate”
在确认页面(“do you really want:”)复制查询(红色背景的所有内容)
在顶部点击sql并写:“setforeign\u key\u checks=0;”然后粘贴先前复制的查询
点击“go”
其思想是从数据库中快速获取所有表(只需5秒和2次单击即可完成),但首先禁用外键检查。没有cli,也没有删除数据库并再次添加它。

bnl4lu3b

bnl4lu3b5#

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

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

wwwo4jvm6#

ms sql server 2005+(删除打印以便实际执行…)

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

如果您的数据库平台支持信息模式视图,则获取以下查询的结果并执行它们。

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
jslywgbw

jslywgbw7#

溶液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
ckocjqey

ckocjqey8#

截断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;
qpgpyjmq

qpgpyjmq9#

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"

外部审批系统取决于审批请求
地址取决于客户
客户身份取决于客户
外部标识取决于客户
凭证取决于客户
电子邮件地址取决于客户
批准请求取决于客户
客户状态取决于客户
客户形象取决于客户
列出表格和行数:

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

截断表地址
截断表审批\u外部\u系统
截断表审批请求
截断表国家
截断表凭据
截断表customer
截断表customer\u identification
截断表customer\u映像
截断表customer\u 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
cuxqih21

cuxqih2110#

删除(即删除表)

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
k10s72fa

k10s72fa11#

<?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和表名。

6l7fqoea

6l7fqoea12#

因为我知道这里

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']);

    }
?>

在此处查看详细信息链接

de90aj5v

de90aj5v13#

我发现那个截断表。。即使在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'''
ycl3bljg

ycl3bljg14#

我不确定,但我认为有一个命令,您可以使用它将数据库的模式复制到新数据库中,完成此操作后,您可以删除旧数据库,然后您可以再次将数据库模式复制到旧名称中。

ergxz8rk

ergxz8rk15#

按以下方式使用phpmyadmin:
数据库视图=>检查所有(表)=>空
如果要忽略外键检查,可以取消选中显示以下内容的框:
[]启用外键检查
您需要运行至少4.5.0或更高版本才能获取此复选框。
不是很好,但是嘿,很管用!

相关问题