Encountering Error 1137 in MySQL, which comes with the message “Can’t reopen table: ‘%s’,” can be a source of frustration. This error typically occurs when you’re trying to reference the same temporary table multiple times within a single query, such as in a subquery or a JOIN operation. MySQL’s temporary tables are designed to be visible only to the current session, and they cannot be reopened after they have been closed within the same query execution. Let’s dive into the causes of this error and how to fix it.
Understanding the Error
Temporary tables in MySQL are session-specific and can be referenced multiple times in different queries during the session. However, within a single query execution, a temporary table cannot be referenced more than once.
Diagnosing the Problem
To diagnose the issue, look for queries that reference a temporary table more than once. This often happens in complex queries involving subqueries, JOIN operations, or UNION statements.
Fixing the Error
Here are some examples of problematic scenarios and how to correct them:
Incorrect Usage of Temporary Table
CREATE TEMPORARY TABLE temp_table AS SELECT * FROM regular_table;
SELECT *
FROM temp_table
JOIN temp_table AS alias_table ON temp_table.id = alias_table.id; -- This will cause Error 1137
In this example, the same temporary table temp_table
is being referenced twice in the JOIN, which is not allowed.
Corrected Query Without Duplicate Temporary Table Reference
One way to fix this is to avoid directly referencing the temporary table more than once:
CREATE TEMPORARY TABLE temp_table AS SELECT * FROM regular_table;
CREATE TEMPORARY TABLE temp_table_copy AS SELECT * FROM temp_table;
SELECT *
FROM temp_table
JOIN temp_table_copy AS alias_table ON temp_table.id = alias_table.id;
Here, we create a copy of the temporary table and use it in the JOIN, thus avoiding the error.
Incorrect Usage in Subquery
CREATE TEMPORARY TABLE temp_table AS SELECT * FROM regular_table;
SELECT *
FROM temp_table
WHERE id IN (SELECT id FROM temp_table); -- This will cause Error 1137
Using the temporary table in a subquery like this will also cause the error.
Corrected Query Using Derived Table
Instead of a subquery, you can use a derived table:
CREATE TEMPORARY TABLE temp_table AS SELECT * FROM regular_table;
SELECT *
FROM temp_table
WHERE id IN (SELECT id FROM (SELECT * FROM temp_table) AS derived_table);
This approach avoids directly referencing the temporary table more than once within the same query.
Final Thoughts
When faced with Error 1137, review your query for multiple references to the same temporary table and consider restructuring the query to avoid this. Options include creating a copy of the temporary table, using derived tables, or rethinking the query logic to eliminate the need for multiple references. By understanding the constraints of temporary tables in MySQL and adjusting your queries accordingly, you can overcome this error and ensure your database operations run smoothly.