26

次の簡単なテストを実行しようとしています-一時テーブルを作成し、次に2つの異なる選択をUNIONします:

CREATE TEMPORARY TABLE tmp 
SELECT * FROM people;

SELECT * FROM tmp
UNION ALL
SELECT * FROM tmp;

しかし、#1137 - Can't reopen table: 'tmp'

一時テーブルはセッションが続くはずだと思っていました。ここで何が問題なのですか?

4

4 に答える 4

18

このエラーは、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;

この後、ユニオン操作を実行できます。


便利な読書

于 2012-08-25T12:40:56.157 に答える
10

sshekarの答えのおかげでそれを理解しました-この場合の解決策は

  1. 空の一時テーブルを作成します
  2. UNIONする結果を個別にテーブルに挿入します
  3. 一時テーブルを照会する

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一時テーブルを使用して脳を救うを参照してください)

于 2012-08-25T13:04:40.190 に答える
6

TEMPORARYTable Problemsに記載されているとおり:

TEMPORARY同じクエリでテーブルを複数回参照することはできません。たとえば、次は機能しません。

mysql> SELECT * FROM temp_table, temp_table AS t2;
エラー 1137: テーブルを再開できません: 'temp_table'

このエラーは、関数内の異なるステートメントで参照が発生した場合でも、ストアド関数で異なるエイリアスの下で一時テーブルを複数回参照した場合にも発生します。

于 2012-08-25T12:39:43.947 に答える
0

他の人がこの質問/解決策のスレッドを通り過ぎる可能性があるため...古いUbuntu 16.04LTSマシンなどを使用している場合。

上記で報告されたeggyalのように、ここに記載されているように、制限はUbuntu 16.04、mysql 5.7に存在します。バグ/機能はここに記録され、10 年以上無視されていました。同様に、これはmariadbに対してもログに記録され、バージョン 10.2.1 で解決されました。Ubuntu 16.04LTS は mariadb 10.0 を使用するため、この機能は 18.04 などにアップグレードしないと簡単にアクセスできません。外部リポジトリからダウンロードして直接インストールする必要があります。

于 2020-02-11T14:07:43.130 に答える