Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在一个命令中截断MySQL数据库中的所有表?_Mysql - Fatal编程技术网

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

在一个命令中截断MySQL数据库中的所有表?,mysql,Mysql,是否有一个查询(命令)可以在一次操作中截断数据库中的所有表?我想知道我是否可以通过一个查询来实现这一点。如果使用sql server 2005,则有一个隐藏的存储过程,允许您对数据库中的所有表执行一个或一组命令。以下是如何使用此存储过程调用TRUNCATE TABLE: EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?" 这是一篇很好的文章,可以进一步阐述 但是,对于MySql,您可以使用mysqldump并指定--add drop ta

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

如果使用sql server 2005,则有一个隐藏的存储过程,允许您对数据库中的所有表执行一个或一组命令。以下是如何使用此存储过程调用
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]
MS SQL Server 2005+(删除打印以便实际执行…)

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

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

一个想法可能是放下并重新创建表格

编辑:

@乔纳森·莱夫勒:是的

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

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

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

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

以下是一个应截断本地数据库中所有表的过程

如果它不起作用,请告诉我,我将删除此答案

未经测试

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;

没有。没有一个命令可以一次截断所有mysql表。您必须创建一个小脚本来逐个截断表


参考:

使用phpMyAdmin的方式如下:

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

如果要忽略外键检查,可以取消选中显示以下内容的框:

[]启用外键检查

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


这不是我的工作,但是,嘿,它工作了

我发现这样可以删除数据库中的所有表:

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
为我工作 --编辑,修复最后一个命令中的打字错误

Drop(即删除表格) 截断(即空表)
我发现那个截断表。。即使在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'''
  • 要截断一个表,必须从其他表中删除映射到此表中的列的外键约束(实际上是在特定DB/Schema中的所有表上)
  • 因此,首先必须删除所有外键约束,然后进行表截断
  • 或者,使用优化表(在mysql、innodb engine esp中)在数据截断后将使用的数据空间/大小回收到操作系统
  • 执行数据截断后,在同一个表上再次创建相同的外键约束。 请参阅下面的脚本,该脚本将生成执行上述操作的脚本

    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='<TABLE SCHEMA>'
    UNION
    SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<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='<TABLE SCHEMA>'
    INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';
    
    从INFORMATION_SCHEMA.TABLE_CONSTRAINTS中选择CONCAT('ALTER TABLE',TABLE_SCHEMA','。',TABLE_NAME',DROP FOREIGN KEY',CONSTRAINT_NAME',;')
    其中约束类型为外键,表模式为“”
    联合
    从INFORMATION_SCHEMA.TABLES中选择CONCAT('TRUNCATE TABLE',TABLE_SCHEMA','.',TABLE_NAME',;')
    其中,TABLE_SCHEMA=''和TABLE_TYPE='BASE TABLE'
    联合
    从INFORMATION_SCHEMA.TABLES中选择CONCAT('OPTIMIZE TABLE',TABLE_SCHEMA','.',TABLE_NAME',;')
    其中,TABLE_SCHEMA=''和TABLE_TYPE='BASE TABLE'
    联合
    从信息_SCHEMA.KEY_COLUMN_USAGE中选择CONCAT('ALTER TABLE',TABLE_SCHEMA',','TABLE_NAME','ADD CONSTRAINT',CONSTRAINT_NAME','FOREIGN KEY(',COLUMN_NAME','),'REFERENCES',REFERENCED_TABLE_NAME',(',REFERENCED_COLUMN_NAME',);'))
    其中约束_名称如“FK%”和表_模式=“”
    插入文件“C:/DB Truncate.sql”中以“\n”结尾的行;
    
  • 现在,运行生成的Db Truncate.sql脚本

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

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

    Soln 1)

    Soln 2)

    --编辑----


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

  • 选择(全部)要删除的表(全部选中)
  • 从“已选择:”列表中选择“删除”/“截断”
  • 在确认页面(“您真的想:”)复制查询(所有红色背景)
  • 在顶部点击SQL并写:“设置外键检查=0”;然后粘贴之前复制的查询
  • 单击“开始”

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

    截断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=0;
    
    截断表并将其更改回

    SET FOREIGN_KEY_CHECKS=1;
    
    SET FOREIGN_KEY_CHECKS=1; 
    
    使用这个表格
    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;
    
    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;
    
    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
    
    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
    
    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
    
    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
    
    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
    
    mysqldump -u root -p --no-data dbname > schema.sql
    mysqldump -u root -p drop dbname
    mysqldump -u root -p < schema.sql
    
    <?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();
    
    ?>
    
    SET FOREIGN_KEY_CHECKS=0;
    TRUNCATE `table1`;
    TRUNCATE `table2`;
    TRUNCATE `table3`;
    TRUNCATE `table4`;
    TRUNCATE `table5`;
    TRUNCATE `table6`;
    TRUNCATE `table7`;
    SET FOREIGN_KEY_CHECKS=1;
    
    SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
    
    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 ;
    
    call util.trunctables('nameofdatabase');
    
       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; 
    
        $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']);
    
        }
    ?>
    
    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;
    
    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
    
    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"
    }