MySQL DROP所有表,忽略外键

MySQL DROP all tables, ignoring foreign keys

是否有一个好的简单方法可以从MySQL数据库中删除所有表,忽略其中可能存在的任何外键约束?


我发现了一套有用的液滴生成的报表进行调整,所以:

  • 滴到你的数据库的限制生成的样本。
  • 1
    2
    3
    SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
    FROM information_schema.tables
    WHERE table_schema = 'MyDatabaseName';

    注:本表不执行一滴,它只是给你一个清单。你将需要切割和粘贴到您的SQL引擎输出到执行他们。

  • 注意,通过http:/ / / / DOC dev.mysql.com refman drop-table.html 5.5 /,/不坠和级联是对于成本:
  • "RESTRICT and CASCADE are permitted to make porting easier. In MySQL 5.5, they do nothing."

    因此,在降阶的语句:如果你需要工作

    1
    SET FOREIGN_KEY_CHECKS = 0

    这将禁用完整性检查是指,当你做你需要表演一滴,你将要检查与复位键

    1
    SET FOREIGN_KEY_CHECKS = 1
  • 最终的执行应该看起来像:
  • 1
    2
    3
    SET FOREIGN_KEY_CHECKS = 0;
    -- Your semicolon separated list of DROP statements here
    SET FOREIGN_KEY_CHECKS = 1;

    注:使用MySQL的SELECT输出到CAN B选项的帮助。


    从http://www.devdaily.com /博客/邮件/ MySQL /删除MySQL表中的任何阶对外键:

    1
    2
    3
    4
    5
    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;

    (注这是回答如何禁用对外重点检查为了可以把表中的任意命令。它不回答如何自动生成语句删除表的所有现有的表和执行他们在单一的脚本。珍妮不回答。)


    这里是surlydre这样的存储过程修改外键是忽略的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    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`;


    方法包括一个以上的工作比这一个更afaict…

    1
    2
    ( 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


    从这个回答,

    执行:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
      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流数据库集。

    或其他公认的答案,席琳的是简单的,除非你需要它去执行两次,第一和第二个查询,执行查询。我提供一些愚蠢的反向调整到转义特殊字符在数据库和表的名称。

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

    这是一个基于游标的解决方案。但作品作为一个单一的解决如:SQL批处理

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    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`;


    你可以做的:

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

    然后运行生成的查询。他们想要一个单表的滴流的数据库。

    这里是一些帮助在drop table指挥。


    我来这一truter改造在Dion的答案,使它更容易有许多表:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SET GROUP_CONCAT_MAX_LEN = 10000000;
    SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;
    '
    ,
                  GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
                               SEPARATOR ';
    '
    ),
                  ';
    SET FOREIGN_KEY_CHECKS=1;'
    )
    FROM information_schema.tables
    WHERE table_schema = 'SchemaName';

    这整个事情在一场归来,所以你可以一次删除所有的表和复制(使用Copy Field Content (unquoted)在工作台)。如果你有一个电子表,你可以在GROUP_CONCAT()命中一些限制。如果是这样,增加的最大变量(和max_allowed_packet,如果必要的。


    如果在Linux(或任何其他系统,支持管道,回声和grep)你可以做它与一号线:

    1
    2
    3
    4
    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;

    我知道这是一个老问题,但我认为这是一个快速和简单的方法。


    这是通过在一个自动的方式来做:A bash脚本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    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

    从给定数据库中删除所有表的一行程序:

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

    运行此命令将删除数据库名称中的所有表。

    这方面的一个好处是数据库名只显式地写一次。


    在AS AS:PHP易其

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $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,显然用户/护照。


    在一个Linux bash / zsh壳样:

    1
    2
    3
    4
    5
    6
    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"

    这将生成的命令,然后他们立即管A第二客户端实例这将删除的表。

    一位很聪明的课程从这里copied其他答案我只是想复制和可粘贴到一个衬垫(ISH)的工作是做的手术需要。

    当然,你要注意要把你的凭据(两次)在MySQL的命令进行的,太,除非你有一个非常低的安全设置。(或你可以包括你的MySQL命令别名,考查了。)


    googling on topic总是让我想到这个问题,所以这里是使用mysql代码来删除表和视图:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    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`;


    在这里写下乔纳森·瓦特的一些有用的评论来删除所有的表格

    1
    2
    3
    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

    它对我有帮助,我希望它能有用


    这是一个漂亮的老邮件,但没有答案来回答这样的问题,真的在我的意见,所以我希望我的邮件要帮助人民!

    我发现这真的是一个解决方案在我的好作品。

    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命令行。

    希望它帮助!


    在@dion truter和@wade williams给出答案的基础上,下面的shell脚本将删除所有表,首先显示它将要运行的内容,然后让您有机会使用ctrl-c中止。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    #!/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}

    简单明了(可能是)。

    也许不是一个很好的解决办法,但这对我很有帮助,挽救了我的一天。

    服务器版本:5.6.38 MySQL Community Server(GPL)

    我遵循的步骤:

    1
    2
    3
    4
    5
    6
     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外壳

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    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>

    enter image description here


    此解决方案基于@skyligh answer,但支持使用外键删除表。

    1
    2
    3
    4
    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


    1
    2
    3
    4
    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"

    我用下面的一个MSSQL服务器:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    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!!!!')

    replace的_数据库的数据库的名称或删除整个if语句(我喜欢添加安全)。


    迄今为止对我来说最好的解决方案

    选择数据库->右键单击->任务->生成脚本-将打开生成脚本的向导。在"设置脚本"选项中选择对象后,单击"高级"按钮。在"脚本删除并创建"下,选择"脚本删除"。

    运行脚本。