次の簡単なテストを実行しようとしています-一時テーブルを作成し、次に2つの異なる選択をUNIONします:
CREATE TEMPORARY TABLE tmp
SELECT * FROM people;
SELECT * FROM tmp
UNION ALL
SELECT * FROM tmp;
しかし、#1137 - Can't reopen table: 'tmp'
一時テーブルはセッションが続くはずだと思っていました。ここで何が問題なのですか?
このエラーは、MySQL テーブルが一時テーブルを管理する方法が変更されたことを示しています。これは、結合、ユニオン、およびサブクエリに影響を与えます。MySQL エラー「テーブルを再開できません」を修正するには、次の解決策を試してください。
mysql> CREATE TEMPORARY TABLE tmp_journals_2 LIKE tmp_journals;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO tmp_journals_2 SELECT * FROM tmp_journals;
この後、ユニオン操作を実行できます。
sshekarの答えのおかげでそれを理解しました-この場合の解決策は
SQL:
CREATE TEMPORARY TABLE tmp LIKE people;
INSERT INTO tmp SELECT * FROM people; /* First half of UNION */
INSERT INTO tmp SELECT * FROM people; /* Second half of UNION */
SELECT * FROM tmp;
(MySQL一時テーブルを使用して脳を救うを参照してください)
TEMPORARY
Table Problemsに記載されているとおり:
TEMPORARY
同じクエリでテーブルを複数回参照することはできません。たとえば、次は機能しません。mysql> SELECT * FROM temp_table, temp_table AS t2;
エラー 1137: テーブルを再開できません: 'temp_table'このエラーは、関数内の異なるステートメントで参照が発生した場合でも、ストアド関数で異なるエイリアスの下で一時テーブルを複数回参照した場合にも発生します。
他の人がこの質問/解決策のスレッドを通り過ぎる可能性があるため...古いUbuntu 16.04LTSマシンなどを使用している場合。
上記で報告されたeggyalのように、ここに記載されているように、制限はUbuntu 16.04、mysql 5.7に存在します。バグ/機能はここに記録され、10 年以上無視されていました。同様に、これはmariadbに対してもログに記録され、バージョン 10.2.1 で解決されました。Ubuntu 16.04LTS は mariadb 10.0 を使用するため、この機能は 18.04 などにアップグレードしないと簡単にアクセスできません。外部リポジトリからダウンロードして直接インストールする必要があります。