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

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

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

cwdobuhd

cwdobuhd1#

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

  1. SELECT CONCAT(
  2. 'SET FOREIGN_KEY_CHECKS=0; ',
  3. GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
  4. 'SET FOREIGN_KEY_CHECKS=1;'
  5. ) as dropAllTablesSql
  6. FROM ( SELECT Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
  7. FROM INFORMATION_SCHEMA.TABLES
  8. 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 使用此存储过程:

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

这是一篇很好的文章,可以作进一步的阐述。
但是,对于mysql,可以使用mysqldump并指定 --add-drop-tables 以及 --no-data 删除和创建忽略数据的所有表的选项。这样地:

  1. 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#

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

  1. 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+(删除打印以便实际执行…)

  1. EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''

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

  1. SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

对于mysql,请尝试以下操作:

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

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

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

jslywgbw7#

溶液1)

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

溶液2)

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

--编辑----

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

ckocjqey8#

截断mysql示例上的多个数据库表

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

使用查询结果截断表
注意:可能会出现以下错误:

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

如果有外键引用您试图删除/截断的表的表,就会发生这种情况。
在截断表之前,您只需执行以下操作:

  1. SET FOREIGN_KEY_CHECKS=0;

截断表并将其改回

  1. SET FOREIGN_KEY_CHECKS=1;
展开查看全部
qpgpyjmq

qpgpyjmq9#

  1. TB=$( mysql -Bse "show tables from DATABASE" );
  2. for i in ${TB};
  3. do echo "Truncating table ${i}";
  4. mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
  5. sleep 1;
  6. done

--
大卫,
感谢您花时间格式化代码,但这是应该如何应用的。
-库尔特
在unix或linux设备上:
确保你在一个bash shell中。这些命令将从命令行运行,如下所示。
注:
我将凭据存储在~/.my.cnf文件中,因此不需要在命令行中提供凭据。
注:
cpm是数据库名称
我只展示了每个命令的一小部分结果。
查找外键约束:

  1. klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
  2. from information_schema.referential_constraints
  3. where constraint_schema = 'cpm'
  4. order by referenced_table_name"

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

  1. klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
  2. 1 address 297
  3. 2 approval_external_system 0
  4. 3 approval_request 0
  5. 4 country 189
  6. 5 credential 468
  7. 6 customer 6776
  8. 7 customer_identification 5631
  9. 8 customer_image 2
  10. 9 customer_status 13639

截断表:

  1. 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
验证它是否工作:

  1. klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n
  2. 1 address 0
  3. 2 approval_external_system 0
  4. 3 approval_request 0
  5. 4 country 0
  6. 5 credential 0
  7. 6 customer 0
  8. 7 customer_identification 0
  9. 8 customer_image 0
  10. 9 customer_status 0
  11. 10 email_address 0

在windows框上:
注:
cpm是数据库名称

  1. 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#

删除(即删除表)

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

截断(即空表)

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

k10s72fa11#

  1. <?php
  2. // connect to database
  3. $conn=mysqli_connect("localhost","user","password","database");
  4. // check connection
  5. if (mysqli_connect_errno()) {
  6. exit('Connect failed: '. mysqli_connect_error());
  7. }
  8. // sql query
  9. $sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);
  10. // Print message
  11. if ($sql === TRUE) {
  12. echo 'data delete successfully';
  13. }
  14. else {
  15. echo 'Error: '. $conn->error;
  16. }
  17. $conn->close();
  18. ?>

下面是我用来清除表的代码片段。只需更改$conn info和表名。

展开查看全部
6l7fqoea

6l7fqoea12#

因为我知道这里

  1. SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
  2. FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename1','databasename2');

如果无法删除或更新父行:外键约束失败
如果有外键引用您试图删除/截断的表的表,就会发生这种情况。
在截断表之前,您只需执行以下操作:

  1. SET FOREIGN_KEY_CHECKS=0;

截断表并将其改回

  1. SET FOREIGN_KEY_CHECKS=1;

使用此php代码

  1. $truncate = mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");
  2. while($truncateRow=mysql_fetch_assoc($truncate)){
  3. mysql_query($truncateRow['tables_query']);
  4. }
  5. ?>

在此处查看详细信息链接

展开查看全部
de90aj5v

de90aj5v13#

我发现那个截断表。。即使在nocheck约束all之后,外键约束也有问题,所以我使用delete-from语句。这并不意味着不会重置标识种子,您可以始终添加dbcc checkident来实现这一点。
在运行之前,我使用下面的代码将用于截断数据库中所有表的sql打印到消息窗口。这只会让你更难犯错。

  1. EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
  2. EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
  3. EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''
ycl3bljg

ycl3bljg14#

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

ergxz8rk

ergxz8rk15#

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

相关问题