ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

M
Mathias Bynens

删除(即删除表)

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

是的,干净,泰。但是您可能需要使用 -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
基于上述答案和评论,并且因为它们没有按预期工作,我制作了一个简单的 bash 脚本,您可以使用它。您可以在以下位置找到它:gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
w
w. Patrick Gale

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

如果您有数据库的用户和密码,并且您不想在 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”的表的列信息模式
您如何“使用查询结果”截断表?
N
Nemo

以这种方式使用 phpMyAdmin:

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

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

[]启用外键检查

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

它不是 MySQL CLI-fu,但是,它可以工作!


谁说我们没有?这个答案显然对人们有用;它有助于。
如果您有父子数据库模式,这将不起作用。
外键约束失败。
@BrianHannay 编辑答案以添加有关禁用外键检查的复选框的注释。
@BrianHannay 它于 2015 年 6 月在 PMA 4.5.0 中添加。我找到了 changelogoriginal issue
s
sanjay kashalkar

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

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

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

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,修复最后一个命令中的错字


G
George Moik
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 似乎没有将所有表连接在一起。
我能够用 SELECT @str := GROUP_CONCAT(CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, '') SEPARATOR ';\n') 连接所有行
B
Bimal Poudel

我发现像下面的代码那样做最简单,只需用你自己的替换表名。重要的是确保最后一行始终是 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 命令之后
G
Gaurav Gupta

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

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

m
mbinette

要截断一个表,必须从其他表中删除映射到该表中列的外键约束(实际上是在特定 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='

' UNION SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='
' AND TABLE_TYPE='BASE TABLE' UNION SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA, '.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES WHERE 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='
' INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';

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

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

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


D
Dostee

如果使用 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


b
bebbo

这是我的变体,有'一个语句来截断'全部'。

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

现在正是一个声明:-)


这是唯一可靠地为我工作的可编写脚本的解决方案。
V
Vinod Kumar

使用它并形成查询

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
J
Jydipsinh Parmar

因为我知道这里

   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


B
Bjørn T.

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

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


B
Boken

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

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

C
Chandresh M

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

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 服务器。

此外,它包括在内。

设置 FOREIGN_KEY_CHECKS = 0


b
beach

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

让我知道它是否不起作用,我将删除此答案。

未经测试

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/…"
c
cedd

我发现 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'''

P
Pavel Mocan

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

选择(所有)要删除的表(检查全部)从“选择:”列表中选择“删除”/“截断”在确认页面上(“你真的想要:”)复制查询(所有带有红色的背景)在顶部点击SQL并写下:“SET FOREIGN_KEY_CHECKS=0;”然后粘贴之前复制的查询点击“Go”

这个想法是快速从数据库中获取所有表(您在 5 秒和 2 次点击内完成),但首先禁用外键检查。没有 CLI,也没有删除数据库并再次添加它。


使用现成的 GUI 来执行此操作非常方便,并且确实可以解决问题。
G
GJ.

我不确定,但我认为有一个命令可以使用它将数据库的模式复制到新数据库中,一旦你这样做了,你可以删除旧的数据库,然后你可以再次将数据库模式复制到旧的名称。


mysqldump -uuser -ppassword --no-data salesLeadsBrittany >salesLeadsTemplate.sql 这将创建一个仅包含模式的 sql 文件(无数据)。您可以在此命令后删除数据库,并可以通过导入架构重新创建数据库。
f
fthiella
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"

批准_外部_系统取决于批准_请求地址取决于客户客户识别取决于客户外部ID取决于客户凭证取决于客户电子邮件地址取决于客户批准_请求取决于客户客户状态取决于客户客户图像取决于客户

列出表和行数:

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 截断表country 截断表credential 截断表customer 截断表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

R
Roel van Duijnhoven

以下 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

e
emanuele
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql

这实际上是一个非常好的解决方案:)
A
Angelin Nadar

索尔 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。但是,如果您这样做,您将关闭一定程度的安全性。
M
Manisha Bayya

我们可以编写如下的 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 详细信息。使用一个命令,您可以截断数据库中的所有表。


G
Grzegorz Adam Kowalski

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`;

o
om-ha

我发现顶部的 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


L
Lakindu Akash

@Mathias Bynens 的答案的小补充。当我运行这个我得到一个错误,因为外键检查

mysql -Nse 'SHOW TABLES' <database_name> | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; DROP TABLE $table" <database_name>; done

如果数据库中有视图,则返回错误。我必须由 drop view <view_name>; 手动清除视图


M
Mark Redman

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

编辑:

@乔纳森莱弗勒:是的

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

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

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

这会丢失表上的所有约束、权限、视图等——这是一个相当大的麻烦。
您可以进行删除,然后为所有表重新设置种子而不是截断。我认为降价是出于沮丧。只需恢复您的备份。
e
emmanuel
<?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 信息和 TABLE_NAME。


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