AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 1018
Accepted
poelinca
poelinca
Asked: 2011-02-02 23:50:19 +0800 CST2011-02-02 23:50:19 +0800 CST 2011-02-02 23:50:19 +0800 CST

MySQL: DROP TABLE começando com um prefixo

  • 772

EXEMPLO: Tenho mais de 30 tabelas começando com o prefixo "dp_" e cerca de 12 começando com "ex_".

PERGUNTA: Como posso descartar todas as tabelas começando com "dp_" em uma consulta?

mysql
  • 5 5 respostas
  • 21529 Views

5 respostas

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2011-02-21T21:21:51+08:002011-02-21T21:21:51+08:00

    Aqui está um procedimento armazenado que aceita o banco de dados e a string de prefixo como parâmetros:

    DELIMITER $$
    
    DROP PROCEDURE DropTablesWithPrefix $$
    CREATE PROCEDURE DropTablesWithPrefix(db VARCHAR(64),prfx VARCHAR(20))
    StoredProcedure:BEGIN
        DECLARE ndx,maxidx INT;
        DECLARE giventable,SQLSTMT VARCHAR(500);
    
        CREATE TABLE TableZapList
        (
            droptablesql VARCHAR(512),
            idx INT NOT NULL AUTO_INCREMENT PRIMARY KEY
        ) ENGINE=MyISAM;
    
        INSERT INTO TableZapList (droptablesql)
        SELECT CONCAT('DROP TABLE ',table_schema,'.',table_name)
        FROM information_schema.tables
        WHERE table_schema = db AND SUBSTR(table_name,LENGTH(prfx)) = prfx;
        SELECT COUNT(1) INTO maxid FROM TableZapList;
    
        IF maxid = 0 THEN
            LEAVE StoredProcedure;
        END IF;<BR>
    
        SET ndx = 0;
        WHILE ndx < maxid DO
            SET ndx = ndx + 1;
            SELECT droptablesql INTO SQLSTMT FROM TableZapList WHERE idx = ndx;
            SET @sql = SQLSTMT;
            PREPARE stmt FROM @sql;
            EXECUTE stmt;
            DEALLOCATE PREPARE stmt;
        END WHILE;<BR>
    
        SELECT droptablesql FROM TableZapList;
        DROP TABLE TableZapList;
    END;
    
    DELIMITER ;
    

    ATUALIZAÇÃO 2011-07-12 14:55 EDT

    Eu apenas pensei em uma maneira mais limpa e simplista. Em vez de usar um procedimento armazenado, basta usar a função GROUP_CONCAT para reunir todas as tabelas para zap. Em seguida, componha em uma única consulta:

    Aqui está uma consulta para descartar todas as tabelas que começam com wp_pol no banco de dados atual:

    SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')
    FROM information_schema.tables
    WHERE table_schema=database()
    AND table_name like 'wp_pol%';
    

    A próxima coisa a fazer é armazenar o resultado disso em

    SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';')
    INTO @dropcmd
    FROM information_schema.tables
    WHERE table_schema=database()
    AND table_name like 'wp_pol%';
    

    A última coisa é executar o SQL dinâmico usando estes três (3) comandos:

    PREPARE s1 FROM @dropcmd;
    EXECUTE s1;
    DEALLOCATE PREPARE s1;
    

    Aqui está uma demonstração usando o MySQL 5.5.12 no Windows que funciona:

    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 11
    Server version: 5.5.12 MySQL Community Server (GPL)
    
    Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
    
    MySQL (Current test) :: use garbage
    Database changed
    MySQL (Current garbage) :: show tables;
    +------------------------------+
    | Tables_in_garbage            |
    +------------------------------+
    | datas                        |
    | rolando                      |
    | wp_commentmeta               |
    | wp_comments                  |
    | wp_contact_form_7            |
    | wp_links                     |
    | wp_most_read_hits            |
    | wp_options                   |
    | wp_pollsa                    |
    | wp_pollsip                   |
    | wp_pollsq                    |
    | wp_postmeta                  |
    | wp_posts                     |
    | wp_posts_idtracker           |
    | wp_tantan_wordpress_s3_cache |
    | wp_term_relationships        |
    | wp_term_taxonomy             |
    | wp_terms                     |
    | wp_usermeta                  |
    | wp_users                     |
    | wp_w3tc_cdn_queue            |
    +------------------------------+
    21 rows in set (0.00 sec)
    
    MySQL (Current garbage) :: SELECT CONCAT('DROP TABLE ',GROUP_CONCAT(CONCAT(table_schema,'.',table_name)),';') INTO @dropcmd FROM information_schema.tables WHERE table_schema=database() AND table_name like 'wp_pol%';
    Query OK, 1 row affected (0.00 sec)
    
    MySQL (Current garbage) :: SELECT @dropcmd;
    +--------------------------------------------------------------------+
    | @dropcmd                                                           |
    +--------------------------------------------------------------------+
    | DROP TABLE garbage.wp_pollsa,garbage.wp_pollsip,garbage.wp_pollsq; |
    +--------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
    MySQL (Current garbage) :: PREPARE s1 FROM @dropcmd; EXECUTE s1; DEALLOCATE PREPARE s1;
    Query OK, 0 rows affected (0.00 sec)
    Statement prepared
    
    Query OK, 0 rows affected (0.01 sec)
    
    Query OK, 0 rows affected (0.00 sec)
    
    MySQL (Current garbage) :: show tables;
    +------------------------------+
    | Tables_in_garbage            |
    +------------------------------+
    | datas                        |
    | rolando                      |
    | wp_commentmeta               |
    | wp_comments                  |
    | wp_contact_form_7            |
    | wp_links                     |
    | wp_most_read_hits            |
    | wp_options                   |
    | wp_postmeta                  |
    | wp_posts                     |
    | wp_posts_idtracker           |
    | wp_tantan_wordpress_s3_cache |
    | wp_term_relationships        |
    | wp_term_taxonomy             |
    | wp_terms                     |
    | wp_usermeta                  |
    | wp_users                     |
    | wp_w3tc_cdn_queue            |
    +------------------------------+
    18 rows in set (0.00 sec)
    
    MySQL (Current garbage) ::
    

    De uma chance !!!

    • 11
  2. Gaius
    2011-02-03T02:34:21+08:002011-02-03T02:34:21+08:00

    Em primeiro lugar, gere um script para fazer isso no prompt do Unix:

    $  echo "select concat('drop table ', table_name, ';') from information_schema.tables where table_name like 'prefix_%';" |mysql --user=root --password=blah --batch >drop.sql
    

    Substitua o prefixo pelo seu. A --batchopção suprime a formatação sofisticada que o MySQL faz por padrão para que você possa produzir um script SQL executável.

    Revise o script e, se estiver correto, execute drop.sql-o no mysql>prompt.

    • 8
  3. Marian
    2011-02-03T00:20:20+08:002011-02-03T00:20:20+08:00

    Você deve consultar as tabelas do sistema para esses nomes de tabela e construir uma string para executá-la dinamicamente. No SQL Server eu faria algo como:

    declare @x varchar(max), @enter char(2);
    select @x = '', @enter = char(13)+char(10);
    
    Select @x = @x + 'drop table ' + table_name + ';' + @enter    
    from information_schema.tables    
    where table_name like '%accounting%'
    
    print @x
    execute (@x);
    

    Agora você tem que encontrar a tabela de sistema correspondente no MySQL.

    • 4
  4. randomx
    2011-06-17T15:27:48+08:002011-06-17T15:27:48+08:00

    Para responder à sua pergunta, não. Não no MySQL usando um único comando/consulta. Você terá que encadear comandos.

    No entanto, se você deseja atingir seu objetivo, aqui está uma maneira:

    De um script bash algo como:

    #/bin/bash
    TABLES=`mysql -s -e "SELECT CONCAT(TABLE_SCHEMA,'.',TABLE_NAME) AS T FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'dp_%'" -u user -p`
    
    for i in $TABLES; 
    do 
     echo "DROP TABLE $i;" >> drops.sql ; 
    done
    
    cat drops.sql
    

    Em seguida, revise o arquivo drops.sql. Se estiver tudo certo, faça um BACKUP , então...

    mysql -u username -p -v --show-warnings < drops.sql
    
    • 3
  5. Nestor Gonzalez
    2011-12-09T12:20:15+08:002011-12-09T12:20:15+08:00

    Você sempre pode usar um ADMINISTRADOR DE BANCO DE DADOS como o navicat e esse tipo de problema desaparecerá com um simples selecionar e excluir.

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve