Sto usando una procedura memorizzata ricorsiva in MySQL per generare una tabella temporanea chiamata id_list, ma devo usare i risultati di quella procedura in una query di selezione successiva, quindi non posso DROPla tabella temporanea all'interno della procedura ...
BEGIN;
/* generates the temporary table of ID's */
CALL fetch_inheritance_groups('abc123',0);
/* uses the results of the stored procedure in the WHERE */
SELECT a.User_ID
FROM usr_relationships r
INNER JOIN usr_accts a ON a.User_ID = r.User_ID
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list)
GROUP BY r.User_ID;
COMMIT;
Quando si chiama la procedura, il primo valore è l'ID superiore del ramo che desidero, e il secondo è l' tierusato dalla procedura durante le ricorsioni. Prima del ciclo ricorsivo verifica se tier = 0e se è in esecuzione:
DROP TEMPORARY TABLE IF EXISTS id_list;
CREATE TEMPORARY TABLE IF NOT EXISTS id_list (iid CHAR(32) NOT NULL) ENGINE=memory;
Quindi la mia domanda è: se non DROPeseguo la MEMORYtabella temporanea al termine della procedura o all'interno della mia transazione, per quanto tempo la tabella persisterà in memoria? Viene automaticamente rilasciato al termine della sessione o rimarrà in memoria finché la connessione è aperta?
** NB La risposta ovvia potrebbe essere quella di eliminare la tabella temporanea prima dell'istruzione commit, ma supponiamo per un momento che non posso farlo. *
EDIT : per essere un po 'più precisi, cosa succede se vengono utilizzate connessioni persistenti, la tabella persisterà attraverso più richieste? Finora sembra che lo farà e che dovremmo rimuovere esplicitamente la tabella temporanea per liberare quella risorsa.
AGGIORNAMENTO : Sulla base dei consigli dei commentatori, ho trovato un modo per adattare la mia procedura memorizzata in modo da poter utilizzare la tabella MEMP TEMP, ma poterla esplicitamente DROPalla fine ...
Invece di chiamare semplicemente la procedura memorizzata e utilizzare la tabella TEMP rimanente per raccogliere i risultati nella query effettiva, ho modificato il CALLformato per utilizzare una terza OUTvariabile in questo modo:
CALL fetch_inheritance_groups('abc123','0',@IDS);
... poi all'interno della procedura memorizzata, ho aggiunto un secondo IF tier = 0alla fine con il seguente:
IF tier = 0
THEN
SELECT GROUP_CONCAT(DISTINCT iid SEPARATOR ',') FROM id_list INTO inherited_set;
DROP TEMPORARY TABLE IF EXISTS id_list;
END IF;
Quindi il risultato della procedura memorizzata è ora un elenco separato da virgole di ID compatibili FIND_IN_SET, e quindi la query finale è stata modificata in modo che:
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list)
... è ora ...
WHERE r.Group_ID = 'abc123' OR FIND_IN_SET(r.Group_ID,@IDS)
Ecco! Grazie ai commentatori per il tuo contributo e per avermi dato il motivo per cui ho dovuto provare un po 'di più :)

DROPla MEMORIA temporanea tavolo. Presumo correttamente?