ERROR 1146: Table doesn't exist
El error 1146 aparece cuando una consulta hace referencia a una tabla que MySQL no encuentra. A primera vista parece el error más sencillo de todos, porque basta con que la tabla no exista para que salte, pero en la práctica es famoso por aparecer precisamente cuando estás convencido de que la tabla sí existe. Una base de datos equivocada, una diferencia de mayúsculas entre Windows y Linux, una migración que no se ejecutó en producción o una tabla temporal creada en otra conexión son causas muy habituales. En este artículo verás cómo leer el mensaje, cuáles son esas causas y cómo diagnosticar cada una con consultas concretas.
El mensaje de error
El mensaje completo incluye el código 1146, el estado SQL 42S02 y el nombre de la tabla que no se encuentra, precedido por el nombre de la base de datos en la que MySQL la ha buscado. Por ejemplo, si escribimos mal el nombre de la tabla productos:
SELECT nombre, precio FROM productoss;ERROR 1146 (42S02): Table 'tienda_mysql.productoss' doesn't exist
La parte más útil del mensaje es precisamente ese prefijo con el nombre de la base de datos. MySQL no dice simplemente que la tabla no existe, sino que no existe en esa base concreta. Si el mensaje dice 'test.productos' cuando esperabas 'tienda_mysql.productos', ya sabes que el problema no es la tabla, sino que estás conectado a otra base de datos. Merece la pena leer ese nombre con atención antes de ponerse a buscar el problema en otro sitio.
Causas y soluciones
Las causas del error 1146 van desde lo trivial hasta lo bastante sutil como para hacerte perder una tarde. A continuación se explican las más frecuentes, cada una con un ejemplo del error y su corrección.
Errata en el nombre de la tabla
La causa más común es la más simple: el nombre está mal escrito. Letras duplicadas, un plural donde la tabla está en singular o un guion bajo que falta son suficientes para que MySQL no la encuentre:
SELECT * FROM detalle_pedido;ERROR 1146 (42S02): Table 'tienda_mysql.detalle_pedido' doesn't exist
Si la tabla real se llama detalles_pedido, la solución es corregir el nombre. Cuando no recuerdas el nombre exacto, lo más rápido es listar las tablas que contienen una parte del nombre con SHOW TABLES LIKE, que acepta los mismos comodines que el operador LIKE:
SHOW TABLES LIKE '%pedido%';+-----------------------------------+
| Tables_in_tienda_mysql (%pedido%) |
+-----------------------------------+
| detalles_pedido |
| pedidos |
+-----------------------------------+
Base de datos equivocada o sin seleccionar
La segunda causa es estar trabajando en una base de datos distinta de la que crees. Ocurre mucho cuando tienes varias bases en el mismo servidor, como tienda_mysql y tienda_mysql_test, o cuando la cadena de conexión de la aplicación apunta a otra base. Para saber en qué base de datos estás, usa la función DATABASE():
SELECT DATABASE();+------------+
| DATABASE() |
+------------+
| test |
+------------+
Si el resultado no es el esperado, cambia de base con USE, que se explica con detalle en el artículo sobre cómo seleccionar una base de datos. También puedes calificar la tabla con el nombre de la base, lo que funciona con independencia de la base activa:
USE tienda_mysql;
SELECT nombre FROM productos;
SELECT nombre FROM tienda_mysql.productos;Si DATABASE() devuelve NULL, no hay ninguna base seleccionada. En ese caso MySQL no llega a mostrar el error 1146, sino su pariente cercano, el ERROR 1046 (3D000): No database selected. La solución es la misma: ejecutar USE o indicar la base en la cadena de conexión. Si lo que falla es la propia base de datos, porque el nombre no existe en el servidor, el error será otro, el ERROR 1049 Unknown database.
Mayúsculas y minúsculas: el problema de Windows a Linux
Esta es la causa más desconcertante, porque la tabla existe y el nombre está bien escrito, salvo por una mayúscula. En MySQL, cada tabla se corresponde con archivos en el disco, y por eso la distinción entre mayúsculas y minúsculas en los nombres de tabla depende del sistema operativo y de la variable lower_case_table_names:
| Valor | Sistema por defecto | Comportamiento |
|---|---|---|
0 | Linux | Los nombres se guardan tal cual y se distinguen mayúsculas: Productos y productos son tablas distintas |
1 | Windows | Los nombres se guardan en minúsculas y se comparan sin distinguir mayúsculas |
2 | macOS | Los nombres se guardan tal cual, pero se comparan en minúsculas |
El problema típico aparece al desarrollar en Windows o macOS y desplegar en un servidor Linux. En local, una consulta con FROM Productos funciona aunque la tabla se llame productos, pero en producción falla:
SELECT nombre FROM Productos;ERROR 1146 (42S02): Table 'tienda_mysql.Productos' doesn't exist
Puedes comprobar el valor de la variable en cada servidor con esta consulta:
SHOW VARIABLES LIKE 'lower_case_table_names';+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| lower_case_table_names | 0 |
+------------------------+-------+
La solución correcta es corregir la consulta para que use exactamente el mismo nombre que la tabla. Cambiar la variable no es una salida rápida: desde MySQL 8.0, lower_case_table_names solo se puede establecer al inicializar el directorio de datos, y el servidor no arranca si después se configura un valor distinto al que se usó en la inicialización. Cambiarla implicaría exportar todos los datos, reinicializar el servidor y volver a importarlos. Conviene aclarar que esto afecta solo a los nombres de tablas y bases de datos; los nombres de columna nunca distinguen mayúsculas en MySQL.
Para localizar una tabla sin importar cómo esté escrita, puedes buscarla en information_schema.TABLES comparando en minúsculas:
SELECT TABLE_SCHEMA, TABLE_NAME
FROM information_schema.TABLES
WHERE LOWER(TABLE_NAME) = 'productos';+--------------+------------+
| TABLE_SCHEMA | TABLE_NAME |
+--------------+------------+
| tienda_mysql | Productos |
+--------------+------------+
Esta consulta tiene la ventaja añadida de buscar en todas las bases del servidor, así que también detecta el caso en que la tabla existe, pero en otra base de datos.
Migración o script no ejecutado
Otro caso habitual es que la tabla exista en tu entorno local pero no en el servidor donde se ejecuta la aplicación. Ocurre cuando se despliega código nuevo que usa una tabla creada en una migración que todavía no se ha aplicado en producción, o cuando se restaura una copia antigua de la base de datos. El error aparece en cuanto la aplicación intenta leer o escribir en la tabla nueva.
La comprobación es sencilla: ejecuta SHOW TABLES en el servidor afectado y compara el resultado con tu entorno local. Si la tabla falta, la solución es ejecutar las migraciones pendientes o el script de creación correspondiente. Si necesitas crearla a mano, el artículo sobre CREATE TABLE explica la sintaxis completa. Si la tabla existía con otro nombre y alguien la renombró, comprueba si hay alguna migración que ejecute RENAME TABLE.
Tabla temporal creada en otra sesión
Las tablas temporales solo son visibles para la conexión que las crea y se eliminan automáticamente cuando esa conexión se cierra. Si creas una tabla temporal en una sesión e intentas consultarla desde otra, MySQL responde con el error 1146, porque para esa segunda sesión la tabla simplemente no existe:
-- Sesión 1
CREATE TEMPORARY TABLE tmp_ventas_mes AS
SELECT producto_id, SUM(cantidad) AS unidades
FROM detalles_pedido
GROUP BY producto_id;
-- Sesión 2
SELECT * FROM tmp_ventas_mes;ERROR 1146 (42S02): Table 'tienda_mysql.tmp_ventas_mes' doesn't exist
Este problema aparece mucho en aplicaciones que usan un pool de conexiones: la petición que crea la tabla temporal y la que la consulta pueden acabar en conexiones distintas. La solución es crear y usar la tabla temporal dentro de la misma conexión o, si los datos deben compartirse entre sesiones, usar una tabla normal. Tienes más detalles en el artículo sobre tablas temporales.
Vista que referencia una tabla eliminada
Si una vista se basa en una tabla que después se ha eliminado o renombrado, la vista sigue existiendo, pero deja de funcionar. En este caso el error que ves al consultar la vista no es el 1146, sino el 1356, que indica que la vista hace referencia a tablas, columnas o funciones que ya no son válidas:
ERROR 1356 (HY000): View 'tienda_mysql.v_ventas_mensuales' references invalid table(s) or column(s) or function(s) or definer/invoker of view lack rights to use them
La solución es recrear la tabla que falta o redefinir la vista para que apunte a la tabla correcta. El artículo sobre CREATE VIEW explica cómo hacerlo con CREATE OR REPLACE VIEW.
Archivos de tabla copiados a mano
El último caso es menos frecuente, pero conviene conocerlo porque suele surgir al intentar "restaurar" una base de datos copiando archivos. En MySQL 8, las tablas InnoDB se registran en un diccionario de datos interno. Si copias archivos .ibd al directorio de datos del servidor sin más, MySQL no sabe que esas tablas existen, porque no están registradas en el diccionario, y cualquier consulta sobre ellas devuelve el error 1146 aunque los archivos estén en el disco.
La recomendación es no mover bases de datos copiando archivos del directorio de datos. Lo seguro es usar una copia lógica generada con mysqldump y restaurarla con el cliente mysql, como se explica en el artículo sobre cómo restaurar un dump. MySQL también ofrece un mecanismo específico para mover tablas InnoDB entre servidores a nivel de archivo, los tablespaces transportables, pero requiere un procedimiento concreto con FLUSH TABLES ... FOR EXPORT en el origen y ALTER TABLE ... IMPORT TABLESPACE en el destino, y no consiste en copiar archivos sin más.
Cómo diagnosticar el error
Cuando aparece el error 1146 y no ves la causa a simple vista, conviene seguir un orden fijo de comprobaciones que descarta las causas de la más probable a la menos probable. El primer paso es leer el nombre completo que muestra el mensaje y comprobar en qué base de datos estás:
SELECT DATABASE();Si la base es la correcta, el segundo paso es listar las tablas que contiene y buscar la que falla, prestando atención a mayúsculas y a pequeñas diferencias en el nombre:
SHOW TABLES;
SHOW TABLES LIKE '%producto%';Si la tabla no aparece en esa base, el tercer paso es buscarla en todo el servidor con information_schema, sin distinguir mayúsculas, para saber si existe en otra base o con otra capitalización:
SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_TYPE
FROM information_schema.TABLES
WHERE LOWER(TABLE_NAME) LIKE '%producto%';La columna TABLE_TYPE te indica además si se trata de una tabla normal (BASE TABLE) o de una vista (VIEW). Si la tabla no aparece en ninguna base, lo más probable es que nunca se haya creado en ese servidor, así que el cuarto paso es revisar las migraciones y los scripts de despliegue. Por último, si la tabla existe con otra capitalización, comprueba lower_case_table_names en los dos entornos para entender por qué funcionaba en uno y no en el otro.
Cómo evitar el error 1146
La mayoría de los errores 1146 se evitan con unas pocas costumbres. La más importante es usar siempre nombres de tabla en minúsculas, con palabras separadas por guion bajo, como detalles_pedido o clientes_direcciones. Con esa convención, el valor de lower_case_table_names deja de importar y el mismo código funciona igual en Windows, macOS y Linux.
La segunda costumbre es gestionar la estructura de la base de datos con migraciones versionadas y ejecutarlas como parte del despliegue, de forma que ningún entorno quede con tablas de menos. La tercera es indicar la base de datos de forma explícita en la configuración de la aplicación, en lugar de depender de la base activa por defecto, y usar entornos con nombres claramente distintos para desarrollo, pruebas y producción. Por último, conviene que tu entorno local se parezca lo más posible a producción: si en producción usas Linux, desarrollar con MySQL en Docker o en WSL hace que los problemas de mayúsculas aparezcan en tu máquina y no en el servidor.
Resumen
El ERROR 1146 (42S02): Table doesn't exist indica que MySQL no encuentra la tabla en la base de datos que muestra el propio mensaje. Antes de nada, lee ese nombre completo y comprueba con SELECT DATABASE() que estás en la base correcta. Después, busca la tabla con SHOW TABLES LIKE y con information_schema.TABLES comparando en minúsculas, porque la diferencia de mayúsculas entre Windows y Linux es una de las causas más frecuentes. Si la tabla no existe en ningún sitio, revisa las migraciones pendientes, y recuerda que las tablas temporales solo existen en la conexión que las crea. Si en lugar de 1146 ves el error 1046, falta seleccionar una base de datos; si ves el 1356, el problema está en una vista que apunta a una tabla que ya no existe.
Escrito por Eduardo Lázaro
