2012-08-25 21 views
17

sto cercando di eseguire il seguente semplice test-creazione di una tabella temporanea, e quindi UNIONing due diverse selezioni:Impossibile UNION ALL su un tavolo temporaneo?

CREATE TEMPORARY TABLE tmp 
SELECT * FROM people; 

SELECT * FROM tmp 
UNION ALL 
SELECT * FROM tmp; 

Ma ottenere un #1137 - Can't reopen table: 'tmp'

ho pensato tabelle temporanee dovevano durare la sessione . Qual è il problema qui?

+1

possibile duplicato di [Come muoversi MySQL "Impossibile riaprire tabella" errore] (http://stackoverflow.com/questions/343402/get-around-mysql-cant-reopen-table-error) – LittleBobbyTables

+1

@ LittleBobby- Non vedo alcuna soluzione applicabile in quella – Yarin

+0

quante tabelle temporanee diverse è necessario utilizzare ..? – heretolearn

risposta

14

Questo errore indica che il modo in cui le tabelle di MySQL gestisce le tabelle temporanee è stato modificato, che a sua volta influenza i join, sindacati e subquery. Per la correzione di errore mysql non può riaprire tavolo, provare la seguente soluzione:

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; 

Dopo questo è possibile eseguire l'operazione di unione.

http://dev.mysql.com/doc/refman/5.0/en/temporary-table-problems.html

http://www.mysqlrepair.org/mysqlrepair/cant-reopen-table.php

+1

Funziona, ma la replica delle tabelle temporanee non sembra migliore della creazione di 2 dall'origine? – Yarin

+0

La tabella temporanea viene eliminata quando termina la sessione client corrente. Vedi http://www.tutorialspoint.com/mysql/mysql-temporary-tables.htm – heretolearn

+0

Mi è venuta una buona risposta [risposta] (http: // stackoverflow.com/a/12122220/165673) basato su questo - grazie per avermi indirizzato nella giusta direzione – Yarin

6

Come documentato in TEMPORARY Table Problems:

Non si può fare riferimento a una tabella TEMPORARY più di una volta nella stessa query. Ad esempio, il seguente non funziona:

mysql> SELECT * FROM temp_table, temp_table AS t2; 
ERROR 1137: Can't reopen table: 'temp_table'

Questo errore si verifica anche se si fa riferimento a una tabella temporanea più volte in una funzione memorizzata sotto diversi pseudonimi, anche se i riferimenti si verificano in diverse affermazioni all'interno della funzione.

+7

DAVVERO? Questo sembra spazzare via il 90% della loro utilità. Mi manca una soluzione ovvia? – Yarin

+0

Bene, puoi accedervi in ​​una query diversa ... –

+0

Sam- come faresti in questo caso? – Yarin

6

capito grazie alla sshekar's risposta- la soluzione in questo caso sarebbe

  1. creare una tabella temporanea vuota
  2. inserire i risultati che vogliamo UNION nel tavolo separatamente
  3. Interrogare la tabella temporanea

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; 

(Vedi Using MySQL Temporary Tables to save your brain)

+3

O semplicemente "CREA TABELLA TEMPORANEA tmp SELECT * FROM persone UNION ALL SELECT * FROM people'? – eggyal

Problemi correlati