Navegando em Bancos de Dados: Uso Prático dos Comandos USE e DESCRIBE
Aprenda a usar os comandos MySQL USE e DESCRIBE com segurança ao alternar entre bancos de dados e inspecionar esquemas de tabelas.
Navegando em Bancos de Dados: Uso Prático dos Comandos USE e DESCRIBE
USE e DESCRIBE são comandos pequenos do MySQL, mas economizam tempo real quando você está trabalhando em um shell, depurando o banco de dados de outra pessoa ou verificando um esquema antes de escrever uma consulta. Eles também previnem um erro muito comum: executar o SQL certo no banco de dados errado.
Se você passa a maior parte do dia dentro de um framework de aplicação, é fácil esquecer o quão útil o cliente MySQL pode ser. Você conecta, olha ao redor, inspeciona uma tabela e responde a uma pergunta em um minuto. O truque é agir com cuidado. Bancos de dados de produção frequentemente contêm esquemas com nomes semelhantes, tabelas antigas, sobras de staging e colunas que não significam exatamente o que seus nomes sugerem.
O que USE realmente altera
A instrução USE do MySQL define o banco de dados padrão para a sessão atual. Depois de executá-la, nomes de tabelas não qualificados são resolvidos em relação a esse banco de dados.
USE ecommerce_db;
A partir desse ponto, esta consulta:
SELECT id, email FROM customers LIMIT 5;
significa:
SELECT id, email FROM ecommerce_db.customers LIMIT 5;
A configuração é específica da sessão. Se você abrir outro terminal, outra aba do cliente de banco de dados ou reconectar após um tempo limite, precisará selecionar o banco de dados novamente. A própria documentação do MySQL descreve USE como escolher o banco de dados nomeado como o banco de dados padrão atual para instruções subsequentes, que é exatamente como você deve pensar sobre isso.
Antes de alternar, liste o que existe:
SHOW DATABASES;
Em seguida, selecione o alvo:
USE ecommerce_db;
Confirme onde você está:
SELECT DATABASE();
Essa última verificação vale os toques extras no teclado antes de qualquer comando destrutivo. Já vi pessoas manterem três terminais abertos, todos com prompts semelhantes, e então executarem um DELETE rápido no terminal errado. Um plugin de prompt pode ajudar, mas SELECT DATABASE(); ainda é a verificação de verdade mais simples.
Quando qualificar nomes de tabelas em vez disso
USE é conveniente, mas nem sempre é a opção mais clara. Se você está comparando dois bancos de dados, nomes totalmente qualificados são mais seguros:
SELECT COUNT(*) FROM production.users;
SELECT COUNT(*) FROM staging.users;
Isso remove ambiguidade. Também torna anotações coladas mais fáceis de entender depois, porque o nome do banco de dados está na própria consulta.
Para migrações e scripts de manutenção pontuais, prefiro nomes qualificados para qualquer coisa arriscada. Para inspeção interativa, USE é suficiente, desde que você continue verificando o contexto.
A sensibilidade a maiúsculas/minúsculas dos nomes de bancos de dados pode variar conforme o sistema operacional e a configuração do MySQL. O comportamento dos nomes de tabelas também pode variar. Não confie em nomes com maiúsculas/minúsculas misturadas sendo portáveis. Se sua equipe usa nomes de esquemas e tabelas em minúsculas em todos os lugares, continue seguindo essa convenção.
O que DESCRIBE mostra a você
DESCRIBE, frequentemente abreviado para DESC, mostra a estrutura da tabela. No trabalho diário com MySQL, ele responde a perguntas como:
- Qual é o nome exato da coluna?
- Este campo pode ser nulo?
- Qual tipo de dados esta tabela realmente usa?
- Existe uma chave primária?
- A coluna é auto-incrementada?
- Qual valor padrão uma inserção receberá?
Use assim:
DESCRIBE customers;
ou:
DESC customers;
Um resultado típico se parece com isso:
+-------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------+------+-----+---------+----------------+
| id | bigint unsigned | NO | PRI | NULL | auto_increment |
| email | varchar(255) | NO | UNI | NULL | |
| name | varchar(120) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
+-------------+------------------+------+-----+---------+----------------+
A coluna Key é uma dica rápida, não um relatório completo de índices. PRI significa chave primária. UNI significa que a coluna faz parte de um índice único. MUL geralmente significa que a coluna é indexada, mas pode conter valores repetidos. Se você precisar de detalhes completos do índice, use SHOW INDEX FROM customers; em vez disso.
O analisador MySQL trata DESCRIBE e EXPLAIN como sinônimos em alguns contextos. Na prática, as pessoas geralmente dizem DESCRIBE nome_da_tabela quando querem a estrutura da tabela e EXPLAIN SELECT ... quando querem um plano de execução de consulta.
Um fluxo de trabalho de inspeção realista
Imagine que você está depurando um trabalho de checkout que falhou. Os logs da aplicação dizem Unknown column 'payment_status', mas você não tem certeza de qual banco de dados o worker usa.
Comece conectando-se como somente leitura, se possível:
mysql -u readonly_user -p -h db.example.internal
Procure por bancos de dados prováveis:
SHOW DATABASES;
Selecione aquele que o aplicativo deveria estar usando:
USE shop_production;
SELECT DATABASE();
Liste as tabelas se você não souber o nome exato:
SHOW TABLES LIKE '%order%';
Inspecione a tabela:
DESCRIBE orders;
Talvez você encontre payment_state, não payment_status. Ou talvez a coluna exista em staging, mas não em produção. Isso lhe diz se o bug é uma incompatibilidade de código/configuração, uma migração perdida ou simplesmente a conexão de banco de dados errada.
Antes de escrever um INSERT, DESCRIBE também é útil:
DESC products;
Se sku é NOT NULL, price é decimal(10,2) e created_at não tem padrão, sua inserção precisa incluir esses campos:
INSERT INTO products (sku, name, price, created_at)
VALUES ('MOUSE-USB-01', 'USB mouse', 19.99, NOW());
Isso é muito melhor do que adivinhar, falhar e depois ler uma longa mensagem de erro.
Use SHOW CREATE TABLE quando DESCRIBE não for suficiente
DESCRIBE é rápido, mas esconde detalhes importantes. Ele não mostra chaves estrangeiras claramente, expressões de colunas geradas, definições completas de índices, particionamento, comentários ou opções de tabela. Quando você precisar da definição real da tabela, execute:
SHOW CREATE TABLE orders\G
O formato de saída \G é mais fácil de ler para resultados largos no cliente MySQL. Este comando é especialmente útil antes de alterar uma tabela, porque mostra o DDL exato que o MySQL conhece.
Por exemplo, DESCRIBE pode mostrar que customer_id tem MUL na coluna Key. SHOW CREATE TABLE pode lhe dizer se o índice é apenas em customer_id ou parte de um índice composto como (customer_id, created_at). Essa diferença importa para desempenho e para decidir se um novo índice é realmente necessário.
Erros comuns com USE e DESCRIBE
O primeiro erro é assumir que USE muda algo fora da sua sessão. Não muda. Seu aplicativo, outro terminal e a conexão de outro usuário mantêm seu próprio contexto.
O segundo erro é esquecer que nomes de tabelas podem ser qualificados. Se você executar:
USE staging;
SELECT * FROM production.users LIMIT 5;
O MySQL lê de production.users, não de staging.users, porque a consulta nomeia explicitamente o banco de dados. Isso é útil quando intencional e perigoso quando colado descuidadamente.
O terceiro erro é tratar DESCRIBE como uma verificação de qualidade de dados. Ele informa a forma, não o conteúdo. Uma coluna pode ser anulável mesmo que a aplicação nunca espere nulos. Um campo varchar(255) pode conter strings vazias. Uma coluna de preço decimal pode conter valores importados antigos com arredondamento estranho. Use DESCRIBE para entender o esquema, depois amostre os dados separadamente:
SELECT payment_state, COUNT(*)
FROM orders
GROUP BY payment_state
ORDER BY COUNT(*) DESC;
O quarto erro é executar instruções de escrita em uma sessão onde você não confirmou o banco de dados. Crie o hábito: SELECT DATABASE();, inspecione, depois escreva.
Um hábito mais seguro para o trabalho diário com MySQL
Quando abro um shell MySQL em um ambiente compartilhado, sigo um ritmo curto:
SHOW DATABASES;
USE target_database;
SELECT DATABASE();
SHOW TABLES;
DESCRIBE important_table;
Para qualquer coisa arriscada, adiciono:
START TRANSACTION;
-- inspecione ou altere um pequeno número de linhas
ROLLBACK;
Depois, executo novamente a alteração pretendida apenas quando tenho certeza. Esse padrão de transação não se encaixa em toda instrução DDL ou comportamento de engine, mas para muitas verificações de dados, dá a você uma chance de verificar sua cláusula WHERE antes de confirmar.
USE e DESCRIBE não são comandos avançados, e esse é o ponto. Eles fornecem orientação. USE diz ao MySQL para onde nomes de tabelas não qualificados devem apontar. DESCRIBE diz a você como uma tabela se parece antes de consultá-la ou alterá-la. Usados juntos, eles tornam o trabalho interativo com banco de dados mais calmo, rápido e menos propenso a erros.