删除不在列表中的表?

时间:2011-05-03 20:27:08

标签: mysql sql database sql-drop

我需要减少约20k桌子。我知道不要删除的表的名称。

如果我有表名“a,b,c,d,e,f,g ......”,我怎样才能删除列表“a,b,c”中没有的所有表格?

7 个答案:

答案 0 :(得分:3)

您可以使用此

获取列表
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.TABLES 
WHERE table_schema = <whatever your db name is> 
AND table_name NOT IN (<your list>);

然后复制并粘贴!

答案 1 :(得分:2)

我建议你采取以下方法

  • 使用SHOW TABLES(或information_schema.TABLES
  • 每行提取一个表的所有表的完整列表
  • 在文本编辑器中打开列表
  • 删除您不想从列表中删除的表格
  • 使用宏或搜索/替换将每行转换为DROP TABLE命令

现在您有一个可以针对数据库运行的SQL脚本

如果您是Linux shell,忍者可能希望使用uniqxargs等命令行工具来操作文件。使用电子表格可能是处理它的另一种方式。

答案 2 :(得分:2)

尝试使用此方法获取SQL DROP语句的结果集:

SELECT CONCAT('DROP TABLE ', TABLE_NAME , ';')
FROM INFORMATION_SCHEMA.TABLES

WHERE TABLE_SCHEMA='YourDatabase'
AND TABLE_NAME NOT IN ('Table1', 'Table2');

复制并粘贴结果,您已获得20,000- n DROP语句。

答案 3 :(得分:1)

您需要从information_schema.tables运行select并创建一个游标,该游标将遍历结果并执行相应的drop(使用if语句)。这是因为drop语句不支持选择/过滤或其他选项。 (除非在过去两三年内发生了变化)

当您执行select语句时,您可以使用以下内容:

WHERE table_name NOT IN ('ssss','dddd');

另一件事是:为什么数据库中有20k表?????

答案 4 :(得分:0)

如果您能够在短时间内保持不可用的表格,我将建议采用完全不同的方法。

  • 备份您要保留的表格
  • DROP DATABASE包含
  • 中所有表格的数据库
  • 从备份中还原要保留的表

答案 5 :(得分:0)

我今天遇到了同样的问题。以下是跳过表ABC,DEF和XYZ的一种方法:

'use strict';

module.exports = {
    up: function (queryInterface, Sequelize) {

        /*
         Add altering commands here.
         Return a promise to correctly handle asynchronicity.

         Example:
         return queryInterface.bulkInsert('Person', [{
         name: 'John Doe',
         isBetaMember: false
         }], {});
         */
        return queryInterface.bulkInsert('Users', [{
            id: Sequelize.UUIDV4,
            username: 'someone@email.com',
            email: 'someone@email.com'
        }], {});
    },

    down: function (queryInterface, Sequelize) {
        /*
         Add reverting commands here.
         Return a promise to correctly handle asynchronicity.

         Example:
         return queryInterface.bulkDelete('Person', null, {});
         */
        return queryInterface.bulkDelete('Users', null, {});
    }
};

那么魔鬼究竟是什么呢?

  1. 第一个mysql调用获取所有没有标题行(-N选项)的表
  2. mysql的输出通过管道发送到Perl
  3. Perl脚本添加第一行以跳过外键检查,因为我们正在删除表
  4. 然后脚本为每个表添加DROP TABLE X,跳过表ABC,DEF和XYZ
  5. Perl的输出转到mysql,修改相同的数据库

答案 6 :(得分:0)

有一种更简单的方法。在一行中,在命令行上键入:

mysql -u root -p[password] --skip-column-names [database] -e "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='[database]' AND TABLE_NAME NOT IN ('[table 1]', '[table 2]',..'[table n]');" | cut -f1 | sed -r 's/(.*)/DROP TABLE IF EXISTS \1;/' | mysql -u root -p[password] [database]

您可能会收到两条关于在命令中包含密码的警告。如果这可能是个问题,您可以清除命令历史记录以“删除证据”: - )

history -c