MySQL DROP все таблицы, игнорируя внешние ключи

404

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

bcmcfc
источник
1
Если у вас нет множества других объектов, почему бы просто не DROP DATABASE и начать все с нуля?
StuartLC
161
Сохранять привилегии пользователей.
bcmcfc
5
Я только что понял, что тем временем вы получили ответ Дион Трутер, который является более полным, чем мой, и предлагаете принять его вместо этого. ( часть «
Отбрось
5
Кстати, если у вас установлен phpMyAdmin, легко выбрать все таблицы и удалить их.
Пользователь
1
Это правда, но только для phpMyAdmin в версии 4.x. Если вы выбираете все таблицы и выбираете Dropиз выпадающего меню, вы можете снять Foreign key checkфлажок.
jmarceli

Ответы:

475

Я нашел сгенерированный набор операторов drop полезным и рекомендую следующие настройки:

  1. Ограничьте сгенерированные капли в вашей базе данных следующим образом:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

Примечание 1: Это не выполняет операторы DROP, а просто дает вам их список. Вам нужно будет вырезать и вставить вывод в ваш движок SQL, чтобы выполнить их.

Примечание 2: Если у вас есть VIEW, вам придется корректировать каждый DROP TABLE `VIEW_NAME`оператор DROP VIEW `VIEW_NAME`вручную.

  1. Обратите внимание, что в http://dev.mysql.com/doc/refman/5.5/en/drop-table.html отбрасывание каскадом бессмысленно / вводит в заблуждение:

«RESTRICT и CASCADE позволяют упростить портирование. В MySQL 5.5 они ничего не делают».

Поэтому, чтобы операторы drop работали, если вам нужно:

SET FOREIGN_KEY_CHECKS = 0

Это отключит проверку ссылочной целостности - поэтому, когда вы закончите выполнять необходимые отбрасывания, вы захотите сбросить проверку ключа с помощью

SET FOREIGN_KEY_CHECKS = 1
  1. Окончательное исполнение должно выглядеть так:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

NB: чтобы легче использовать вывод SELECT, может помочь опция mysql -B.

Дион Трутер
источник
6
@Timmm: я написал 3 капли в своем ответе - однако, это не выполняет их также. Вы должны скопировать их из Stackoverflow и вставить их в MySQL Workbench или где угодно. При выборе выше вы получаете все соответствующие капли "бесплатно". Вы просто должны скопировать и вставить их.
Чиккодоро
3
Да, я знаю, но я хотел использовать это в сценарии. То, что я в итоге сделал DROP DATABASE foo; CREATE DATABASE foo;, это не совсем то же самое, но сработало для меня.
Тимммм
2
Не удобно, когда есть сотни таблиц, но лучше, чем ничего, если воссоздание базы данных не вариант.
Николас Рауль
2
@Timmmm: Глядя на это еще раз - вы правы, это не полностью отвечает на вопрос. Ответ Джина выглядит многообещающим - он автоматически генерирует операторы DROP и выполняет их, одновременно применяя SET FOREIGN_KEY_CHECKS до и после.
chiccodoro
1
используйте терминал, если вы используете Linux или Mac, и он будет работать для входа в учетную запись типа MySQL: mysql -u <username> -p, затем нажмите enter, введите свой пароль, выберите базу данных, затем напишите приведенный выше код для удаления таблиц
ismnoiet
132

С http://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys :

SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;

(Обратите внимание, что это ответ на вопрос о том, как отключить проверку внешнего ключа, чтобы иметь возможность отбрасывать таблицы в произвольном порядке. Он не отвечает, как автоматически генерировать операторы отбрасываемых таблиц для всех существующих таблиц и выполнять их в одном сценарии. Ответ Жана делает.)

chiccodoro
источник
10
Если вы используете MySQL Workbench, вы можете избежать ввода всех имен таблиц, выбрав все таблицы в левом столбце, щелкнув правой кнопкой мыши и выбрав опцию «отбрасывать таблицы». Он сгенерирует SQL-код, который вы можете скопировать и вставить между инструкциями SET FOREGIN_KEY_CHECKS - вероятно, аналогично в других графических интерфейсах.
Крис
спасибо, полезно, и @ Крис супер полезно, должен добавить ответ
Эндрю
97

Вот хранимая процедура SurlyDre, измененная так, что внешние ключи игнорируются:

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_sql = CONCAT('DROP TABLE ', _tableName);
        PREPARE stmt1 FROM @stmt_sql;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    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
Работает на таблицах, не удаляет представления. Все еще уменьшил мой набор текста :) спасибо.
chrisinmtown
Через 7 лет я бы сказал, что вы должны завернуть _tableNameв кавычки. В противном случае произойдет сбой в некоторых таблицах, таких как groupили другие ключевые слова.
Сашааэро
Береги взгляды! ВЫБЕРИТЕ table_name FROM information_schema.TABLES WHERE table_schema = SCHEMA () И table_type = "BASE TABLE";
Лоран Беллоил
42

каждый вышеперечисленный подход включает в себя гораздо больше работы, чем этот AFAICT ...

( mysqldump --add-drop-table --no-data -u root -p database | grep 'DROP TABLE' ) > ./drop_all_tables.sql
mysql -u root -p database < ./drop_all_tables.sql
SkyLeach
источник
2
почему не только трубы , mysqldumpчтобы mysql, минуя файл?
Рольф
2
@ Рольф без особой причины. Сбей себя с ног.
SkyLeach
2
Спасибо, я уже сделал, сняли скобку и конвейер mysqldumpв grepINTO mysql, он работает. Еще раз спасибо за ваше решение, это хорошо.
Рольф
5
В этом не хватает ограничений внешнего ключа; Я добавил здесь сценарий bash, основанный на вашем ответе: gist.github.com/cweinberger/c3f2882f42db8bef9e605f094392468f
cweinberger
ооооооооооо умное!
zx1986
25

Из этого ответа ,

выполнить:

  use `dbName`; --your db name here
  SET FOREIGN_KEY_CHECKS = 0; 
  SET @tables = NULL;
  SET GROUP_CONCAT_MAX_LEN=32768;

  SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables
  FROM   information_schema.tables 
  WHERE  table_schema = (SELECT DATABASE());
  SELECT IFNULL(@tables, '') INTO @tables;

  SET        @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
  PREPARE    stmt FROM @tables;
  EXECUTE    stmt;
  DEALLOCATE PREPARE stmt;
  SET        FOREIGN_KEY_CHECKS = 1;

Это удаляет таблицы из базы данных, используемой в настоящее время. Вы можете установить текущую базу данных, используя use.


В противном случае принятый ответ Дион проще, за исключением того, что вам нужно выполнить его дважды, сначала для получения запроса, а затем для выполнения запроса. Я предоставил несколько глупых обратных галочек для экранирования специальных символов в именах БД и таблиц.

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here
Навфал
источник
Краткое и чистое решение. Способ лучше, чем альтернатива процедуры.
Рафаэль Ренан Пачеко
16

Вот решение на основе курсора. Вроде долго, но работает как один пакет SQL:

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;

    OPEN _cursor;

    REPEAT FETCH _cursor INTO _tableName;

    IF NOT _done THEN
        SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
        PREPARE stmt1 FROM @stmt_sql;
        EXECUTE stmt1;
        DEALLOCATE PREPARE stmt1;
    END IF;

    UNTIL _done END REPEAT;

    CLOSE _cursor;

END$$

DELIMITER ;

call drop_all_tables(); 

DROP PROCEDURE IF EXISTS `drop_all_tables`;
SurlyDre
источник
2
Хорошо, но, к сожалению, он не обрабатывает внешние ключи.
Тимммм
11

Ты можешь сделать:

select concat('drop table if exists ', table_name, ' cascade;')
  from information_schema.tables;

Затем запустите сгенерированные запросы. Они будут отбрасывать каждую таблицу в текущей базе данных.

Вот некоторая помощь по drop tableкоманде.

Пабло Санта Круз
источник
Приведенный выше ответ предполагает, что ||установлен оператор конкатенации. В частности, режим SQL MySQL содержит PIPES_AS_CONCAT. Ссылка: dev.mysql.com/doc/refman/5.0/en/…
Иону Г. Стэн
@Ionut: круто! Спасибо что подметил это. Исправлен пример кода для использования concatвместо||
Пабло Санта Круз
9

Я придумал эту модификацию в ответе Дион Трутер, чтобы упростить многие таблицы:

SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n', 
              GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
                           SEPARATOR ';\n'),
              ';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';

Это возвращает всю вещь в одном поле, так что вы можете скопировать один раз и удалить все таблицы (используйте Copy Field Content (unquoted)в Workbench). Если у вас много таблиц, вы можете использовать некоторые ограничения GROUP_CONCAT(). Если это так, увеличьте переменную max len (и max_allowed_packet, если необходимо).

Райан П
источник
SET GROUP_CONCAT_MAX_LEN был трюк, который мне был нужен. У меня был скрипт, который работал, но всегда не удавалось в первый раз с каким-либо усеченным именем таблицы, а затем успешно завершался при повторном запуске. Спасибо!
dualmon
8

Один вкладыш для удаления всех таблиц из данной базы данных:

echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"

Выполнение этого удалит все таблицы из базы данных DATABASE_NAME.

И хорошо то, что имя базы данных пишется только один раз.

mgershen
источник
1
у меня это сработало, но мне пришлось заменить -i на -I в macOS High Sierra
Али Сельчук
1
Спасибо @AliSelcuk. И -i, и -I у меня работают в Ubuntu, поэтому я изменю его на -I, чтобы это работало и для macOS.
mgershen
1
Очень полезно, спасибо! Мне пришлось передать пароль с помощью -pPASSWORD (без пробела между -p и PASSWORD) обеим командам mysql
Майк
8

Поиск в теме по теме всегда приводит меня к такому вопросу, поэтому здесь работает код 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`;
Сергей Алаев
источник
6

Вот автоматический способ сделать это с помощью bash-скрипта:

host=$1
dbName=$2
user=$3
password=$4

if [ -z "$1" ]
then
    host="localhost"
fi

# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do  echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done
kfox
источник
Очень нравится это решение, но я не вижу, как используется переменная хоста. Кажется, он не используется ни в одном вызове mysql в цикле for.
Мэтью Закшевский
1
Извините, пропустил ввод в команду, обновил.
Kfox
5

Если в 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;

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

moretti.fabio
источник
2

В 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 на имя вашей базы данных, и, очевидно, на пользователя / пароль.

nsbucky
источник
2

В оболочке 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) действительно выполнял работу, которую хотел OP.

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

artfulrobot
источник
2

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

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

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

Pavel.Solovyenko
источник
2

Удалите все таблицы из базы данных одной строкой из командной строки:

mysqldump -u [user_name] -p[password] -h [host_name] --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [user_name] -p[password] -h [host_name] [database_name]

Где [имя_пользователя], [пароль], [имя_хоста] и [имя_базы_данных] должны быть заменены реальными данными (пользователь, пароль, имя хоста, имя базы данных).

Петр Лозовицкий
источник
1

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

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

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командную строку.

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

mokk
источник
Полезно, но на самом деле это не отвечает на вопрос.
jrosell
1

Основываясь на ответе @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}
Филипп Каллендер
источник
0

Это решение основано на ответе @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
pgmank
источник
0
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"
Эрнестас Станкявичюс
источник
0

Просто и понятно (может быть).

Не может быть причудливым решением, но это сработало и спасло мой день.

Работал для версии сервера: 5.6.38 MySQL Community Server (GPL)

Шаги, за которыми я следовал:

 1. generate drop query using concat and group_concat.
 2. use database
 3. disable key constraint check
 4. copy the query generated from step 1
 5. enable key constraint check
 6. run show table

Оболочка MySQL

mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

mysql> 

введите описание изображения здесь

Санджай
источник
-1

Я использую следующее с сервером MSSQL:

if (DB_NAME() = 'YOUR_DATABASE') 
begin
    while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
    begin
         declare @sql nvarchar(2000)
         SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
         FROM information_schema.table_constraints
         WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
         exec (@sql)
         PRINT @sql
    end

    while(exists(select 1 from INFORMATION_SCHEMA.TABLES))
    begin
         declare @sql2 nvarchar(2000)
         SELECT TOP 1 @sql2=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
         FROM INFORMATION_SCHEMA.TABLES
        exec (@sql2)
        PRINT @sql2
    end
end
else
    print('Only run this script on the development server!!!!')

Замените YOUR_DATABASE именем вашей базы данных или удалите весь оператор IF (мне нравится дополнительная безопасность).

Кристиан Макс
источник
-7

Лучшее решение для меня до сих пор

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

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

Азза Идз
источник
Это почти сработало, но я щелкнул зеленую кнопку перед синей кнопкой, получил коробку слева и нажал кнопку «Отмена», но потом я выпил свой кофе и забыл об этом.
Рольф
Не могли бы вы объяснить, где вы нажали? Есть ли какой-нибудь инструмент для этого?
Нико Хаазе