Navegando bases de datos: Uso práctico de los comandos USE y DESCRIBE

Aprende a usar USE y DESCRIBE de MySQL de forma segura al cambiar de base de datos e inspeccionar esquemas de tablas.

Navegando bases de datos: Uso práctico de los comandos USE y DESCRIBE

USE y DESCRIBE son comandos pequeños de MySQL, pero ahorran tiempo real cuando trabajas en un shell, depurando la base de datos de otra persona o revisando un esquema antes de escribir una consulta. También previenen un error muy común: ejecutar el SQL correcto en la base de datos equivocada.

Si pasas la mayor parte del día dentro de un framework de aplicación, es fácil olvidar lo útil que puede ser el cliente de MySQL. Te conectas, miras alrededor, inspeccionas una tabla y respondes una pregunta en un minuto. El truco es moverse con cuidado. Las bases de datos de producción a menudo contienen esquemas con nombres similares, tablas antiguas, sobrantes de staging y columnas que no significan exactamente lo que sugieren sus nombres.

Lo que realmente cambia USE

La declaración USE de MySQL establece la base de datos predeterminada para la sesión actual. Después de ejecutarla, los nombres de tabla no calificados se resuelven contra esa base de datos.

USE ecommerce_db;

A partir de ese momento, esta consulta:

SELECT id, email FROM customers LIMIT 5;

significa:

SELECT id, email FROM ecommerce_db.customers LIMIT 5;

La configuración es específica de la sesión. Si abres otra terminal, otra pestaña del cliente de base de datos o te reconectas después de un tiempo de espera, necesitas seleccionar la base de datos nuevamente. La documentación de MySQL describe USE como elegir la base de datos nombrada como la base de datos predeterminada actual para declaraciones posteriores, que es exactamente cómo deberías pensar en ello.

Antes de cambiar, enumera lo que existe:

SHOW DATABASES;

Luego selecciona el objetivo:

USE ecommerce_db;

Confirma dónde estás:

SELECT DATABASE();

Esa última verificación vale las pulsaciones de teclas adicionales antes de cualquier comando destructivo. He visto personas mantener tres terminales abiertas, todas con indicaciones similares, y luego ejecutar un DELETE rápido en la incorrecta. Un complemento de indicación puede ayudar, pero SELECT DATABASE(); sigue siendo la verificación de verdad más simple.

Cuándo calificar nombres de tabla en su lugar

USE es conveniente, pero no siempre es la opción más clara. Si estás comparando dos bases de datos, los nombres completamente calificados son más seguros:

SELECT COUNT(*) FROM production.users;
SELECT COUNT(*) FROM staging.users;

Eso elimina la ambigüedad. También hace que las notas pegadas sean más fáciles de entender más tarde porque el nombre de la base de datos está en la consulta misma.

Para migraciones y scripts de mantenimiento únicos, prefiero nombres calificados para cualquier cosa riesgosa. Para inspección interactiva, USE está bien siempre que sigas verificando el contexto.

La sensibilidad a mayúsculas y minúsculas del nombre de la base de datos puede variar según el sistema operativo y la configuración de MySQL. El comportamiento del nombre de la tabla también puede variar. No confíes en que los nombres con mayúsculas y minúsculas mixtas sean portátiles. Si tu equipo usa nombres de esquema y tabla en minúsculas en todas partes, sigue esa convención.

Lo que DESCRIBE te muestra

DESCRIBE, a menudo abreviado como DESC, muestra la estructura de la tabla. En el trabajo diario de MySQL, responde preguntas como:

  • ¿Cuál es el nombre exacto de la columna?
  • ¿Este campo puede ser nulo?
  • ¿Qué tipo de datos usa realmente esta tabla?
  • ¿Hay una clave primaria?
  • ¿La columna se auto-incrementa?
  • ¿Qué valor predeterminado obtendrá una inserción?

Úsalo así:

DESCRIBE customers;

o:

DESC customers;

Un resultado típico se ve así:

+-------------+------------------+------+-----+---------+----------------+
| 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    |                |
+-------------+------------------+------+-----+---------+----------------+

La columna Key es una pista rápida, no un informe completo de índices. PRI significa clave primaria. UNI significa que la columna es parte de un índice único. MUL generalmente significa que la columna está indexada pero puede contener valores repetidos. Si necesitas detalles completos del índice, usa SHOW INDEX FROM customers; en su lugar.

El analizador de MySQL trata DESCRIBE y EXPLAIN como sinónimos en algunos contextos. En la práctica, la gente suele decir DESCRIBE nombre_tabla cuando quiere la estructura de la tabla y EXPLAIN SELECT ... cuando quiere un plan de ejecución de consulta.

Un flujo de trabajo de inspección realista

Imagina que estás depurando un trabajo de pago fallido. Los registros de la aplicación dicen Unknown column 'payment_status', pero no estás seguro de qué base de datos usa el trabajador.

Comienza conectándote en modo solo lectura si es posible:

mysql -u readonly_user -p -h db.example.internal

Busca bases de datos probables:

SHOW DATABASES;

Selecciona la que la aplicación debería estar usando:

USE shop_production;
SELECT DATABASE();

Enumera las tablas si no sabes el nombre exacto:

SHOW TABLES LIKE '%order%';

Inspecciona la tabla:

DESCRIBE orders;

Tal vez encuentres payment_state, no payment_status. O tal vez la columna existe en staging pero no en producción. Eso te dice si el error es una discrepancia de código/configuración, una migración omitida o simplemente la conexión de base de datos incorrecta.

Antes de escribir un INSERT, DESCRIBE también es útil:

DESC products;

Si sku es NOT NULL, price es decimal(10,2) y created_at no tiene valor predeterminado, tu inserción necesita incluir esos campos:

INSERT INTO products (sku, name, price, created_at)
VALUES ('MOUSE-USB-01', 'USB mouse', 19.99, NOW());

Eso es mucho mejor que adivinar, fallar y luego leer un mensaje de error largo.

Usa SHOW CREATE TABLE cuando DESCRIBE no sea suficiente

DESCRIBE es rápido, pero oculta detalles importantes. No muestra claramente las claves foráneas, expresiones de columnas generadas, definiciones completas de índices, particionamiento, comentarios u opciones de tabla. Cuando necesites la definición real de la tabla, ejecuta:

SHOW CREATE TABLE orders\G

El formato de salida \G es más fácil de leer para resultados anchos en el cliente de MySQL. Este comando es especialmente útil antes de cambiar una tabla porque muestra el DDL exacto que MySQL conoce.

Por ejemplo, DESCRIBE puede mostrar que customer_id tiene MUL en la columna Key. SHOW CREATE TABLE puede decirte si el índice es solo en customer_id o parte de un índice compuesto como (customer_id, created_at). Esa diferencia importa para el rendimiento y para decidir si realmente se necesita un nuevo índice.

Errores comunes con USE y DESCRIBE

El primer error es asumir que USE cambia algo fuera de tu sesión. No lo hace. Tu aplicación, otra terminal y la conexión de otro usuario mantienen su propio contexto.

El segundo error es olvidar que los nombres de tabla pueden calificarse. Si ejecutas:

USE staging;
SELECT * FROM production.users LIMIT 5;

MySQL lee de production.users, no de staging.users, porque la consulta nombra explícitamente la base de datos. Eso es útil cuando es intencional y peligroso cuando se pega descuidadamente.

El tercer error es tratar DESCRIBE como una verificación de calidad de datos. Te dice la forma, no el contenido. Una columna puede ser anulable incluso si la aplicación nunca espera nulos. Un campo varchar(255) puede contener cadenas vacías. Una columna de precio decimal puede contener valores importados antiguos con redondeo extraño. Usa DESCRIBE para entender el esquema, luego muestra los datos por separado:

SELECT payment_state, COUNT(*)
FROM orders
GROUP BY payment_state
ORDER BY COUNT(*) DESC;

El cuarto error es ejecutar declaraciones de escritura en una sesión donde no has confirmado la base de datos. Crea el hábito: SELECT DATABASE();, inspecciona, luego escribe.

Un hábito más seguro para el trabajo diario de MySQL

Cuando abro un shell de MySQL en un entorno compartido, sigo un ritmo corto:

SHOW DATABASES;
USE target_database;
SELECT DATABASE();
SHOW TABLES;
DESCRIBE important_table;

Para cualquier cosa riesgosa, agrego:

START TRANSACTION;
-- inspeccionar o cambiar un pequeño número de filas
ROLLBACK;

Luego vuelvo a ejecutar el cambio previsto solo cuando estoy seguro. Ese patrón de transacción no se ajusta a cada declaración DDL o comportamiento del motor, pero para muchas verificaciones de datos te da la oportunidad de verificar tu cláusula WHERE antes de confirmar.

USE y DESCRIBE no son comandos avanzados, y ese es el punto. Te dan orientación. USE le dice a MySQL hacia dónde deben apuntar los nombres de tabla no calificados. DESCRIBE te dice cómo se ve una tabla antes de consultarla o cambiarla. Usados juntos, hacen que el trabajo interactivo de base de datos sea más tranquilo, más rápido y menos propenso a errores.