【问题标题】:How to drop all tables in database without dropping the database itself?如何在不删除数据库本身的情况下删除数据库中的所有表?
【发布时间】:2010-08-16 12:52:31
【问题描述】:

我想从数据库中删除所有表,但不删除数据库本身。是否可以 ?我只是在寻找比删除数据库并重新创建它更短的方法。谢谢!

【问题讨论】:

    标签: php sql mysql drop-table


    【解决方案1】:

    最短的是重新创建数据库。但如果你不想...

    这适用于 MySQL/PHP。未经测试,但类似。

    $mysqli = new mysqli("host", "my_user", "my_password", "database");
    $mysqli->query('SET foreign_key_checks = 0');
    if ($result = $mysqli->query("SHOW TABLES"))
    {
        while($row = $result->fetch_array(MYSQLI_NUM))
        {
            $mysqli->query('DROP TABLE IF EXISTS '.$row[0]);
        }
    }
    
    $mysqli->query('SET foreign_key_checks = 1');
    $mysqli->close();
    

    【讨论】:

      【解决方案2】:

      没有简单的方法可以做到这一点。要么你需要提前知道表格是什么:

      //编辑您可以使用查询SHOW TABLE STATUS获取此信息

      $tables = array('users','otherdata');
      foreach($tables as $table){
        db.execute("DROP TABLE "+$table);
      }
      

      或者你可以删除数据库并重新创建它为空(这真的不是那么努力!):

      db.execute('DROP DATABASE SITEDATA');
      db.execute('CREATE DATABASE SITEDATA');
      

      【讨论】:

      • 如果数据库中有其他东西(存储过程、函数和与这些东西相关的用户权限)删除数据库可能不是 OP 想要的。
      • 正如 fredley 所说,如果您只需要空数据库之外不需要任何东西,只需将其删除并重新创建即可。
      • 如果你不能做 DROP/CREATE,第一种方法是唯一的方法,你不能在一个命令中删除所有表。
      • 但是您可能拥有此数据库的权限,并且无权创建新数据库...
      • 您不必真正了解这些表,您可以从元数据 (select table_name from information_schema.tables where table_type='BASE TABLE' and table_schema='yourdbname') 中查询这些表。
      【解决方案3】:

      您必须分别删除数据库中的每个表,因此删除数据库并重新创建它实际上是最短的路线(也是最快的路线)。

      【讨论】:

        【解决方案4】:

        当我不得不在 Oracle 中执行此操作时,我会编写一个 select 语句来为我生成 drop table 语句。大意是:

        选择“删除表”||表名 || ';'来自用户表;

        然后我可以将 select 语句的输出通过管道传输到文件中。运行此程序后,我将拥有一个文件,可以为我删除所有表格。它看起来像:

        删除表表 1;

        删除表 TABLE2;

        删除表 TABLE3;

        等等……

        不是 mysql 专家,但我想它会有类似的工具来选择模式的所有表,以及从 SQL 语句直接输出到文件。

        【讨论】:

        • 您可能不得不重复应用这样的脚本,因为外键约束的存在可能会阻止表被删除。
        • 当然。可能需要多次通过。
        • 嗯,不一定。如果您在一个事务中删除所有表,您可以推迟约束检查 (SET CONSTRAINTS ALL DEFERRED;) - 在 Oracle 中。在 MySQL 中,您可以暂时禁用外键检查(如我的解决方案 - SET foreign_key_checks = 0;),这至少可以减少所需的阶段数。
        【解决方案5】:

        使用SHOW TABLE STATUS 获取数据库中的所有表,然后遍历结果并一一删除。

        【讨论】:

          【解决方案6】:

          cmets这里有一些解决方案:http://dev.mysql.com/doc/refman/5.1/en/drop-table.html

          【讨论】:

            【解决方案7】:

            我需要从无意的转储中删除除了一对之外的所有表。

            一个 PHP 函数,用于删除除一些表之外的所有表(改编自 here),供其他可能需要的人使用:

            <?php
            $mysqli = new mysqli( "localhost", "user", 'password', "database");
            function drop_all_tables($exceptions_array, $conn) {
                $exceptions_string="('" ;
                foreach ($exceptions_array as $table) {
                    $exceptions_string .=$table . "','";
                }
                $exceptions_string=rtrim($exceptions_string, ",'");
                $exceptions_string .="')" ;
                $sql="SELECT CONCAT('DROP TABLE ', TABLE_NAME, '; ')
                     FROM information_schema.tables
                     WHERE table_schema = DATABASE() AND table_name NOT IN $exceptions_string";
                $result=$ conn->query($sql);
                while($row = $result->fetch_array(MYSQLI_NUM)) {
                    $conn->query($row[0]);
                }
            }
            
            //drop_all_tables(array("table1","table2","table3","table4"), $mysqli);
            ?>
            

            【讨论】:

              【解决方案8】:

              执行此操作的程序方法如下:

              $query_disable_checks = 'SET foreign_key_checks = 0';
              
              $query_result = mysqli_query($connect, $query_disable_checks);
              
              // Get the first table
              $show_query = 'Show tables';
              $query_result = mysqli_query($connect, $show_query);
              $row = mysqli_fetch_array($query_result);
              
              while ($row) {
                $query = 'DROP TABLE IF EXISTS ' . $row[0];
                $query_result = mysqli_query($connect, $query);
              
                // Getting the next table
                $show_query = 'Show tables';
                $query_result = mysqli_query($connect, $show_query);
                $row = mysqli_fetch_array($query_result);
              }
              

              这里的$connect 只是与mysqli_connect(); 建立的连接。

              【讨论】:

                【解决方案9】:

                删除所有表的单行查询,如下:

                $dbConnection = mysqli_connect("hostname", "username", "password", "database_name");
                $dbConnection->query('SET foreign_key_checks = 0');
                
                $qry_drop = "DROP TABLE IF EXISTS buildings, business, computer, education, fashion, feelings, food, health, industry, music, nature, people, places, religion, science, sports, transportation, travel";            
                $dbConnection->query($qry_drop);
                
                $mysqli->query('SET foreign_key_checks = 1');
                $mysqli->close();
                

                【讨论】:

                  【解决方案10】:

                  您可以执行此操作。如果我错过任何表格,只需添加更多表格

                  drop table wp_commentmeta;
                  drop table wp_comments;
                  drop table wp_links;
                  drop table wp_options;
                  drop table wp_postmeta;
                  drop table wp_posts;
                  drop table wp_term_relationships;
                  drop table wp_term_taxonomy;
                  drop table wp_termmeta;
                  drop table wp_terms;
                  drop table wp_usermeta;
                  drop table wp_users;
                  

                  【讨论】:

                    猜你喜欢
                    • 2011-02-01
                    • 2012-11-01
                    • 2015-01-13
                    • 2011-11-20
                    • 2012-04-03
                    • 2013-03-19
                    • 1970-01-01
                    • 2010-11-27
                    • 2023-03-30
                    相关资源
                    最近更新 更多