【发布时间】:2010-08-16 12:52:31
【问题描述】:
我想从数据库中删除所有表,但不删除数据库本身。是否可以 ?我只是在寻找比删除数据库并重新创建它更短的方法。谢谢!
【问题讨论】:
标签: php sql mysql drop-table
我想从数据库中删除所有表,但不删除数据库本身。是否可以 ?我只是在寻找比删除数据库并重新创建它更短的方法。谢谢!
【问题讨论】:
标签: php sql mysql drop-table
最短的是重新创建数据库。但如果你不想...
这适用于 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();
【讨论】:
没有简单的方法可以做到这一点。要么你需要提前知道表格是什么:
//编辑您可以使用查询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');
【讨论】:
select table_name from information_schema.tables where table_type='BASE TABLE' and table_schema='yourdbname') 中查询这些表。
您必须分别删除数据库中的每个表,因此删除数据库并重新创建它实际上是最短的路线(也是最快的路线)。
【讨论】:
当我不得不在 Oracle 中执行此操作时,我会编写一个 select 语句来为我生成 drop table 语句。大意是:
选择“删除表”||表名 || ';'来自用户表;
然后我可以将 select 语句的输出通过管道传输到文件中。运行此程序后,我将拥有一个文件,可以为我删除所有表格。它看起来像:
删除表表 1;
删除表 TABLE2;
删除表 TABLE3;
等等……
不是 mysql 专家,但我想它会有类似的工具来选择模式的所有表,以及从 SQL 语句直接输出到文件。
【讨论】:
SET CONSTRAINTS ALL DEFERRED;) - 在 Oracle 中。在 MySQL 中,您可以暂时禁用外键检查(如我的解决方案 - SET foreign_key_checks = 0;),这至少可以减少所需的阶段数。
使用SHOW TABLE STATUS 获取数据库中的所有表,然后遍历结果并一一删除。
【讨论】:
cmets这里有一些解决方案:http://dev.mysql.com/doc/refman/5.1/en/drop-table.html
【讨论】:
我需要从无意的转储中删除除了一对之外的所有表。
一个 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);
?>
【讨论】:
执行此操作的程序方法如下:
$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(); 建立的连接。
【讨论】:
删除所有表的单行查询,如下:
$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();
【讨论】:
您可以执行此操作。如果我错过任何表格,只需添加更多表格
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;
【讨论】: