MySQL DROP все таблицы, игнорируя внешние ключи - PullRequest
338 голосов
/ 13 августа 2010

Есть ли хороший простой способ удалить все таблицы из базы данных MySQL, игнорируя любые ограничения внешнего ключа, которые могут там быть?

Ответы [ 22 ]

5 голосов
/ 11 ноября 2014

Если в linux (или любой другой системе, которая поддерживает piping, echo и grep), вы можете сделать это одной строкой:

echo "SET FOREIGN_KEY_CHECKS = 0;" > temp.txt; \
mysqldump -u[USER] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP >> temp.txt; \
echo "SET FOREIGN_KEY_CHECKS = 1;" >> temp.txt; \
mysql -u[USER] -p[PASSWORD] [DATABASE] < temp.txt;

Я знаю, что это старый вопрос, но я думаю, что этот метод быстрый и простой.

3 голосов
/ 15 января 2018

Поиск в теме по теме всегда приводит меня к такому вопросу, поэтому здесь работает код mysql, который удаляет ОБА таблицы и представления:

DROP PROCEDURE IF EXISTS `drop_all_tables`;

DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
    DECLARE _done INT DEFAULT FALSE;
    DECLARE _tableName VARCHAR(255);
    DECLARE _cursor CURSOR FOR
        SELECT table_name
        FROM information_schema.TABLES
        WHERE table_schema = SCHEMA();
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;

    SET FOREIGN_KEY_CHECKS = 0;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql1 = CONCAT('DROP TABLE IF EXISTS ', _tableName);
        SET @stmt_sql2 = CONCAT('DROP VIEW IF EXISTS ', _tableName);

        PREPARE stmt1 FROM @stmt_sql1;
        PREPARE stmt2 FROM @stmt_sql2;

        EXECUTE stmt1;
        EXECUTE stmt2;

        DEALLOCATE PREPARE stmt1;
        DEALLOCATE PREPARE stmt2;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;
    SET FOREIGN_KEY_CHECKS = 1;
END$$

DELIMITER ;

call drop_all_tables();

DROP PROCEDURE IF EXISTS `drop_all_tables`;
2 голосов
/ 24 июня 2018

Просто добавьте сюда несколько полезных комментариев, сделанных Джонатаном Ваттом , чтобы удалить все таблицы

MYSQL="mysql -h HOST -u USERNAME -pPASSWORD DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL

Это помогает мне, и я надеюсь, что это может быть полезно

2 голосов
/ 21 августа 2013

В php это так же просто, как:

$pdo = new PDO('mysql:dbname=YOURDB', 'root', 'root');

$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');

$query = "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
          FROM information_schema.tables
          WHERE table_schema = 'YOURDB'";

foreach($pdo->query($query) as $row) {
    $pdo->exec($row[0]);
}

$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');

Просто не забудьте изменить YOURDB на имя вашей базы данных, и, очевидно, на пользователя / pass.

2 голосов
/ 13 июня 2014

В оболочке Linux, такой как bash / zsh:

DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
  mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
  "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
   FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
  } | mysql "$DATABASE_TO_EMPTY"

Это сгенерирует команды, а затем сразу же направит их ко второму клиентскому экземпляру, который удалит таблицы.

Умный бит, конечно, скопирован из других ответов здесь - я просто хотел, чтобы текст с копией и вставкой в ​​одну строку (ish) действительно делал работу, которую хотел ОП.

Примечание конечно, вы должны будете ввести свои учетные данные (дважды) и в эти команды mysql, если только у вас не очень низкий уровень безопасности. (или вы можете использовать псевдоним вашей команды mysql, чтобы включить ваши кредиты.)

1 голос
/ 07 марта 2017

Опираясь на ответ @Dion Truter и @Wade Williams, следующий скрипт оболочки удалит все таблицы после того, как сначала покажет, что он собирается запустить, и даст вам шанс прервать работу с помощью Ctrl-C.

#!/bin/bash

DB_HOST=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx
DB_NAME=xxx

CMD="mysql -sN -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME}"

# Generate the drop statements
TMPFILE=/tmp/drop-${RANDOM}.sql
echo 'SET FOREIGN_KEY_CHECKS = 0;' > ${TMPFILE}
${CMD} $@ >> ${TMPFILE} << ENDD
    SELECT concat('DROP TABLE IF EXISTS \`', table_name, '\`;')
    FROM information_schema.tables
    WHERE table_schema = '${DB_NAME}';
ENDD
echo 'SET FOREIGN_KEY_CHECKS = 1;' >> ${TMPFILE}

# Warn what we are about to do
echo
cat ${TMPFILE}
echo
echo "Press ENTER to proceed (or Ctrl-C to abort)."
read

# Run the SQL
echo "Dropping tables..."
${CMD} $@ < ${TMPFILE}
echo "Exit status is ${?}."
rm ${TMPFILE}
1 голос
/ 20 августа 2015

Это довольно старый пост, но ни один из ответов здесь действительно не ответил на вопрос, на мой взгляд, поэтому я надеюсь, что мой пост поможет людям!

Я нашел это решение по другому вопросу, который очень хорошо работает для меня:

mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done

Это фактически очистит все ваши таблицы в базе данных DB_NAME, а не только отобразит командную строку TRUNCATE.

Надеюсь, это поможет!

0 голосов
/ 04 апреля 2018

Это решение основано на ответе @SkyLeach, но с поддержкой удаления таблиц с внешними ключами.

echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql
0 голосов
/ 17 марта 2016

Лучшее решение для меня пока

Выберите База данных -> Щелкните правой кнопкой мыши -> Задачи -> Создать сценарии - откроет мастер для создания сценариев. После выбора объектов в настройках сценариев нажмите Кнопка «Дополнительно» В разделе «Сценарий DROP and CREATE» выберите Script DROP .

Запустить скрипт.

0 голосов
/ 14 сентября 2018
DB="your database name" \
    && mysql $DB < "SET FOREIGN_KEY_CHECKS=0" \
    && mysqldump --add-drop-table --no-data $DB | grep 'DROP TABLE' | grep -Ev "^$" | mysql $DB \
    && mysql $DB < "SET FOREIGN_KEY_CHECKS=1"
...