Как удалить все таблицы в базе данных, не удаляя саму базу данных? - PullRequest
21 голосов
/ 16 августа 2010

Я хотел бы удалить все таблицы из базы данных, но не удалять саму базу данных. Является ли это возможным ? Я просто ищу более короткий путь, чем удаление базы данных и ее создание заново. Спасибо!

Ответы [ 8 ]

36 голосов
/ 16 августа 2010

Самое короткое - это заново создать базу данных. но если ты не хочешь ...

Это для 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();
5 голосов
/ 16 августа 2010

Нет простого способа сделать это. Либо вам нужно заранее знать, что такое таблицы:

// редактировать вы можете получить эту информацию, используя запрос 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');
2 голосов
/ 27 июля 2015

Мне нужно было удалить все таблицы, кроме пары из непреднамеренного дампа.

Функция PHP для удаления всех таблиц, кроме некоторых (адаптировано из здесь ), для всех, кому может понадобиться:

<?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);
?>
2 голосов
/ 16 августа 2010

Здесь есть несколько решений в комментариях: http://dev.mysql.com/doc/refman/5.1/en/drop-table.html

2 голосов
/ 16 августа 2010

Используйте SHOW TABLE STATUS, чтобы получить все таблицы в вашей базе данных, затем переберите результат и удалите их одну за другой.

2 голосов
/ 16 августа 2010

Когда мне приходилось делать это в Oracle, я писал оператор select, который генерировал бы для меня операторы drop table. Что-то с эффектом:

Выберите «DROP TABLE» || имя_таблицы || ';' из user_tables;

Я мог бы затем передать вывод оператора select в файл. После того, как я запустил это, у меня был файл, который отбросил бы все мои таблицы для меня. Это будет выглядеть примерно так:

СТОЛ ТАБЛИЦЫ 1;

СТОЛ ТАБЛИЦЫ 2;

ТАБЛИЦА КАПЛИ 3;

и т.д ...

Не эксперт по MySQL, но я думаю, у него будет аналогичное средство для выбора всех таблиц для схемы, а также для непосредственного вывода из оператора SQL в файл.

2 голосов
/ 16 августа 2010

Вам придется отбрасывать каждую таблицу в БД отдельно, поэтому удаление базы данных и ее воссоздание на самом деле будет самым коротким маршрутом (и самым быстрым в этом отношении).

0 голосов
/ 30 июля 2018

Запрос в одну строку для удаления всех таблиц, как показано ниже:

$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();
...