MySQL Drop alle tabellen, negeer Buitenlandse toetsen

Is er een mooie manier om alle tabellen uit een MySQL-database te laten vallen, waarbij er geen buitenlandse key-beperkingen wordt genegeerd die daar mogelijk zijn?


Antwoord 1, Autoriteit 100%

Ik vond de gegenereerde set druppelafschriften nuttig en beveel deze tweaks aan:

  1. Beperk de gegenereerde druppels naar uw database zoals deze:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';

OPMERKING 1: Dit voert de druppelafschriften niet uit, het geeft u gewoon een lijst hiervan. U moet de uitvoer in uw SQL-motor snijden en plakken om deze uit te voeren.

Note 2: Als u weergaven heeft, moet u elke DROP TABLE `VIEW_NAME`Verklaring naar DROP VIEW `VIEW_NAME`Handmatig.

  1. Notitie, per http://dev.mySQL.com /DOC/REFMAN/5.5/EN/DROP-TABLE.HTML , het laten vallen met Cascade is zinloos / misleidend:

“Beperken en Cascade zijn toegestaan ​​om porteer gemakkelijker te maken. In MySQL 5.5 doen ze niets.”

Daarom, om de druppelafschriften te laten werken als u nodig hebt:

SET FOREIGN_KEY_CHECKS = 0

Hierdoor wordt referentiële integriteitscontroles uitgeschakeld – dus wanneer u klaar bent met het uitvoeren van de druppels die u nodig hebt, wil u de toetscontrole opnieuw instellen met

SET FOREIGN_KEY_CHECKS = 1
  1. De definitieve uitvoering moet eruit zien:
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;

NB: om de uitvoer van SELECT gemakkelijker te gebruiken, kan de optie mysql -B helpen.


Antwoord 2, autoriteit 24%

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

(Merk op dat dit antwoord geeft op het uitschakelen van externe sleutelcontroles om de tabellen in willekeurige volgorde te kunnen laten vallen. Het geeft geen antwoord op het automatisch genereren van drop-table-instructies voor alle bestaande tabellen en deze in een enkel script uit te voeren . Jean’s antwoordwel.)


Antwoord 3, autoriteit 19%

Hier is SurlyDre’s opgeslagen procedure aangepast zodat buitenlandse sleutels worden genegeerd:

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

Antwoord 4, Autoriteit 9%

Elke hierboven benadering bevat veel meer werk dan deze 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

Antwoord 5, Autoriteit 5%

Van Dit antwoord ,

Uitvoeren:

 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;

Deze druppels tafels uit de database die momenteel in gebruik is. U kunt de huidige database instellen met use.


Of anders is het geaccepteerde antwoord van Dion eenvoudiger, behalve dat u het twee keer nodig hebt, eerst om de vraag te krijgen en de tweede om de query uit te voeren. Ik heb enkele dwaze back-ticks verstrekt om speciale tekens in DB- en tabelnamen te ontsnappen.

 SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
  FROM   information_schema.tables
  WHERE  table_schema = 'dbName'; --your db name here

Antwoord 6, autoriteit 3%

Hier is een op cursor gebaseerde oplossing. Best lang, maar werkt als een enkele SQL-batch:

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

Antwoord 7, autoriteit 2%

U kunt het volgende doen:

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

Voer vervolgens de gegenereerde query’s uit. Ze zullen elke tabel in de huidige database laten vallen.

Hieris wat hulp bij drop tablecommando.


Antwoord 8

Ik kwam met deze wijziging op het antwoord van Dion Truter om het met veel tabellen gemakkelijker te maken:

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

Dit retourneert het hele ding in één veld, dus u kunt één keer kopiëren en alle tabellen verwijderen (gebruik Copy Field Content (unquoted)in Workbench). Als je VEEL tafels hebt, kan het zijn dat je een aantal limieten bereikt op GROUP_CONCAT(). Als dat zo is, verhoog dan de max len variabele (en max_allowed_packet, indien nodig).


Antwoord 9

Een one-liner om alle tabellen uit een bepaalde database te verwijderen:

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

Als u dit uitvoert, worden alle tabellen uit de database DATABASE_NAME verwijderd.

En het leuke hiervan is dat de databasenaam maar één keer expliciet wordt geschreven.


Antwoord 10

Googelen op onderwerp brengt me altijd bij deze ZO-vraag, dus hier is werkende mysql-code die BEIDE tabellen en weergaven verwijdert:

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

Antwoord 11

Hier is een geautomatiseerde manier om dit te doen via een bash-script:

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

Antwoord 12

Eenstapsoplossing zonder de geretourneerde waarde uit de SQL Select-query te kopiëren met behulp van de procedure.

SET FOREIGN_KEY_CHECKS = 0;
SET SESSION group_concat_max_len = 1000000;
SET @TABLES = NULL;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name,'`') INTO @TABLES FROM information_schema.tables 
  WHERE table_schema = 'databaseName';
SET @TABLES = CONCAT('DROP TABLE IF EXISTS ', @TABLES);
PREPARE stmt FROM @TABLES;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET SESSION group_concat_max_len = 1024;
SET FOREIGN_KEY_CHECKS = 1

Antwoord 13

Als je in linux (of een ander systeem dat piping, echo en grep ondersteunt) je het met één regel kunt doen:

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;

Ik weet dat dit een oude vraag is, maar ik denk dat deze methode snel en eenvoudig is.


Antwoord 14

Daal alle tabellen uit de database met een enkele regel vanaf de opdrachtregel:

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]

Waarbij [gebruikersnaam], [wachtwoord], [hostnaam] en [databasenaam] moeten worden vervangen door echte gegevens (gebruiker, wachtwoord, hostnaam, databasenaam).


Antwoord 15

In php is het zo eenvoudig als:

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

Vergeet niet om UWDB te wijzigen in de naam van uw database, en uiteraard de gebruiker/pas.


Antwoord 16

In een Linux-shell zoals 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"

Hierdoor worden de opdrachten gegenereerd en worden ze onmiddellijk doorgesluisd naar een tweede clientinstantie die de tabellen zal verwijderen.

Het slimme stukje is natuurlijk gekopieerd van andere antwoorden hier – ik wilde gewoon een kopieer-en-plakbare one-liner (ish) om daadwerkelijk de klus te doendie de OP wilde.

Opmerkingnatuurlijk moet u uw inloggegevens ook (tweemaal) in deze mysql-commando’s invoeren, tenzij u een zeer lage beveiligingsconfiguratie heeft. (of u kunt uw mysql-opdracht een alias noemen om uw creds op te nemen.)


Antwoord 17

Plaats hier wat nuttige opmerking gemaakt door Jonathan Wattom alle tabellen te laten vallen

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

Het helpt me en ik hoop dat het nuttig kan zijn


Antwoord 18

Dit is een behoorlijk oud bericht, maar geen van de antwoorden hier beantwoordde de vraag echt naar mijn mening, dus ik hoop dat mijn bericht mensen zal helpen!

Ik vond deze oplossing voor een andere vraag die heel goed voor mij werkt:

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

Dat zal feitelijk al je tabellen in de database DB_NAMEleegmaken, en niet alleen de TRUNCATE-opdrachtregel weergeven.

Hopelijk helpt dit!


Antwoord 19

Voortbouwend op het antwoord van @Dion Truter en @Wade Williams, zal het volgende shellscript alle tabellen laten vallen, nadat het eerst heeft laten zien wat het gaat draaien, en je de kans geeft om af te breken met 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}

Antwoord 20

Deze oplossing is gebaseerd op @Skyleach-antwoord, maar met de ondersteuning van druppelafels met buitenlandse sleutels.

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

Antwoord 21

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"

Antwoord 22

eenvoudig en helder (kan zijn).

is misschien geen mooie oplossing, maar dit werkte me en redde mijn dag.

bewerkt voor serverversie: 5.6.38 MySQL Community Server (GPL)

stappen die ik volgde:

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-shell

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> 


Antwoord 23

Ik gebruik het volgende met een MSSQL-server:

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!!!!')

Vervang uw_database met de naam van uw database of verwijder de volledige IF-verklaring (ik hou van de toegevoegde veiligheid).


Antwoord 24

Beste oplossing voor mij tot nu toe

Selecteer Database – & GT; Klik met de rechtermuisknop – & GT; TAKEN – & GT; Genereer scripts – Open Wizard voor het genereren van scripts. Nadat u objecten in Set Scripting-optie hebt gekozen, klikt u op Geavanceerde knop . Onder “Script Drop and Create” Select Script Drop .

RUN SCRIPT.

Other episodes