MySQL upuść wszystkie tabele, ignorując klucze obce

Czy istnieje przyjemny, łatwy sposób na usunięcie wszystkich tabel z bazy danych MySQL, ignorując wszelkie ograniczenia klucza obcego, które mogą tam być?

Author: kenorb, 2010-08-13

21 answers

Uznałem wygenerowany zestaw instrukcji drop za przydatny i polecam te poprawki:

  1. Ogranicz wygenerowane krople do bazy danych w następujący sposób:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

Uwaga: to nie uruchamia poleceń DROP, to tylko daje listę z nich. będziesz musiał wyciąć i wkleić dane wyjściowe do silnika SQL, aby je wykonać.

  1. Uwaga, na http://dev.mysql.com/doc/refman/5.5/en/drop-table.html , upuszczanie kaskady jest bezcelowe / mylące:

"ograniczenie i kaskada są dozwolone, aby ułatwić przenoszenie. W MySQL 5.5 nic nie robią."

Dlatego, aby instrukcje drop działały, jeśli potrzebujesz:

SET FOREIGN_KEY_CHECKS = 0

Spowoduje to wyłączenie sprawdzania integralności referencji - więc kiedy skończysz wykonywać potrzebne dropy, będziesz chciał zresetować sprawdzanie klawiszy za pomocą

SET FOREIGN_KEY_CHECKS = 1
  1. ostateczne wykonanie powinno wyglądać następująco:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

NB: aby użyć wyjścia SELECT łatwiej, opcja mysql-B może pomóc.

 338
Author: Dion Truter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-26 16:56:53

Z 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;

(zwróć uwagę, że ta odpowiedź wyjaśnia, jak wyłączyć sprawdzanie kluczy obcych, aby móc upuszczać tabele w dowolnej kolejności. Nie odpowiada, jak automatycznie generować polecenia drop-table dla wszystkich istniejących tabel i wykonywać je w jednym skrypcie. Jean ' s answer tak.)

 120
Author: chiccodoro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-18 06:19:05

Oto procedura składowana SurlyDre zmodyfikowana tak, że klucze obce są ignorowane:

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`;
 78
Author: Jean-François Beauchamp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-22 08:22:51

From this answer ,

Wykonanie:

  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;

Powoduje usunięcie tabel z aktualnie używanej bazy danych. Bieżącą bazę danych można ustawić za pomocą use.


Lub w inny sposób, zaakceptowana odpowiedź Diona jest prostsza, z wyjątkiem tego, że musisz wykonać ją dwa razy, pierwszy, aby uzyskać zapytanie, a drugi, aby wykonać zapytanie. Podałem kilka głupich back-tików, aby uniknąć znaków specjalnych w DB i nazwach tabel.

  SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here
 17
Author: nawfal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:36

Każde powyższe podejście Zawiera o wiele więcej pracy niż to 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
 16
Author: SkyLeach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-15 19:59:47

Oto rozwiązanie oparte na kursorach. Trochę długi, ale działa jako pojedyncza partia 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`;
 14
Author: SurlyDre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-15 07:00:24

Możesz zrobić:

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

Następnie uruchom wygenerowane zapytania. Wrzucą każdą tabelę do bieżącej bazy danych.

Tutaj {[8] } znajduje się pomoc w Komendzie drop table.

 9
Author: Pablo Santa Cruz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-13 12:40:13

Wymyśliłem tę modyfikację w odpowiedzi Diona Trutera, aby ułatwić to z wieloma tabelami:

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';

Zwróci całą rzecz w jednym polu, więc możesz skopiować raz i usunąć wszystkie tabele (użyj Copy Field Content (unquoted) w Workbenchu). Jeśli masz dużo tabel, może trafić pewne limity na GROUP_CONCAT(). Jeśli tak, zwiększ zmienną max len (i max_allowed_packet, jeśli to konieczne).

 8
Author: Ryan P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-24 01:18:34

Oto automatyczny sposób, aby to zrobić za pomocą skryptu 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 -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do  echo $i && mysql -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done
 4
Author: kfox,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-09 20:33:09

Jeśli w Linuksie (lub innym systemie obsługującym piping, echo i grep) możesz to zrobić za pomocą jednej linii:

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;
Wiem, że to stare pytanie, ale myślę, że ta metoda jest szybka i prosta.
 4
Author: moretti.fabio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-11 18:17:48

Jeden liner do zrzucenia wszystkich tabel z danej bazy danych:

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

Uruchomienie tego spowoduje usunięcie wszystkich tabel z bazy danych DATABASE_NAME.

I fajną rzeczą w tym jest to, że nazwa bazy danych jest zapisywana tylko raz.

 3
Author: mgershen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-01 12:24:13

W php jest tak proste jak:

$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');

Pamiętaj tylko, aby zmienić swoje DB na nazwę bazy danych, i oczywiście użytkownika / pass.

 2
Author: nsbucky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-21 13:38:26

W powłoce Linuksa takiej jak 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"

Spowoduje to wygenerowanie poleceń, a następnie natychmiast przekierowanie ich do drugiej instancji klienta, która usunie tabele.

Sprytny bit jest oczywiście skopiowany z innych odpowiedzi tutaj-chciałem tylko kopiować i wklejać jednoliniowy (ish), aby faktycznie wykonać pracę, którą chciał OP.

Uwaga oczywiście w tych poleceniach mysql musisz też wpisać swoje dane uwierzytelniające (dwa razy), chyba że masz bardzo niskie bezpieczeństwo / align = "left" / (lub możesz alias polecenia mysql, aby dołączyć swoje creds.)

 2
Author: artfulrobot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-08 10:27:58

Googlowanie w temacie zawsze sprowadza mnie do tego pytania więc tutaj działa kod mysql, który usuwa zarówno tabele, jak i widoki:

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
Author: Sergey Alaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 12:29:25

Bazując na odpowiedzi @Dion Truter i @Wade Williams, następujący skrypt powłoki upuści wszystkie tabele, po pierwszym pokazaniu, co ma się uruchomić, i daje szansę na przerwanie za pomocą 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
Author: Philip Callender,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-07 02:05:00

Wystarczy umieścić tutaj kilka przydatnych komentarz wykonany przez Jonathana Watta aby zrzucić wszystkie tabele

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

To mi pomaga i mam nadzieję, że może się przydać

 1
Author: Pavel.Solovyenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-24 11:14:11

To jest dość stary post, ale żadna z odpowiedzi tutaj naprawdę odpowiedział na pytanie moim zdaniem, więc mam nadzieję, że mój post pomoże ludziom!

Znalazłem to rozwiązanie na innym pytaniu, które działa naprawdę dobrze dla mnie:

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

, który faktycznie opróżni wszystkie tabele w bazie danych DB_NAME, a nie tylko wyświetli linię poleceń TRUNCATE.

Mam nadzieję, że to pomoże!
 0
Author: mokk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-20 14:07:59

To rozwiązanie jest oparte na @ SkyLeach answer, ale z obsługą opuszczania tabel z kluczami obcymi.

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
Author: pgmank,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-04 15:15:16
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
Author: Ernestas Stankevičius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-14 09:28:36

Używam następujących z serwerem 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!!!!')

Zastąp YOUR_DATABASE nazwą bazy danych lub usuń całą instrukcję IF(Lubię dodane bezpieczeństwo).

 -1
Author: Christiaan Maks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-23 09:05:56

Najlepsze Rozwiązanie Jak na razie

Wybierz Baza Danych - > kliknij prawym przyciskiem myszy - > zadania - > Generuj Skrypty - otworzy KREATOR do generowania skryptów. Po wybraniu opcji obiekty w Ustaw Skrypty Kliknij przycisk Zaawansowane. W sekcji "script DROP and CREATE" Wybierz Script DROP .

Uruchom skrypt.

 -6
Author: azza idz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-17 14:08:43