MySQL DROP all tables, ignoring foreign keys

前端 未结 24 2570
醉梦人生
醉梦人生 2020-12-02 03:44

Is there a nice easy way to drop all tables from a MySQL database, ignoring any foreign key constraints that may be in there?

相关标签:
24条回答
  • 2020-12-02 03:44

    every approach above includes a lot more work than this one 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
    
    0 讨论(0)
  • 2020-12-02 03:45

    Best solution for me so far

    Select Database -> Right Click -> Tasks -> Generate Scripts - will open wizard for generating scripts. After choosing objects in set Scripting option click Advanced Button. Under "Script DROP and CREATE" select Script DROP.

    Run script.

    0 讨论(0)
  • 2020-12-02 03:46

    Googling on topic always brings me to this SO question so here is working mysql code that deletes BOTH tables and views:

    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`;
    
    0 讨论(0)
  • 2020-12-02 03:47

    This solution is based on @SkyLeach answer but with the support of dropping tables with foreign keys.

    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 讨论(0)
  • 2020-12-02 03:48

    I found the generated set of drop statements useful, and recommend these tweaks:

    1. Limit the generated drops to your database like this:
    SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
    FROM information_schema.tables
    WHERE table_schema = 'MyDatabaseName';
    

    Note 1: This does not execute the DROP statements, it just gives you a list of them. You will need to cut and paste the output into your SQL engine to execute them.

    Note 2: If you have VIEWs, you'll have to correct each DROP TABLE `VIEW_NAME` statement to DROP VIEW `VIEW_NAME` manually.

    1. Note, per http://dev.mysql.com/doc/refman/5.5/en/drop-table.html, dropping with cascade is pointless / misleading:

    "RESTRICT and CASCADE are permitted to make porting easier. In MySQL 5.5, they do nothing."

    Therefore, in order for the drop statements to work if you need:

    SET FOREIGN_KEY_CHECKS = 0
    

    This will disable referential integrity checks - so when you are done performing the drops you need, you will want to reset key checking with

    SET FOREIGN_KEY_CHECKS = 1
    
    1. The final execution should look like:
    SET FOREIGN_KEY_CHECKS = 0;
    -- Your semicolon separated list of DROP statements here
    SET FOREIGN_KEY_CHECKS = 1;
    

    NB: to use output of SELECT easier, mysql -B option can help.

    0 讨论(0)
  • 2020-12-02 03:48

    From this answer,

    execute:

      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;
    

    This drops tables from the database currently in use. You can set current database using use.


    Or otherwise, Dion's accepted answer is simpler, except you need to execute it twice, first to get the query, and second to execute the query. I provided some silly back-ticks to escape special characters in db and table names.

      SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
      FROM   information_schema.tables
      WHERE  table_schema = 'dbName'; --your db name here
    
    0 讨论(0)
提交回复
热议问题