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 DROP
la 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' tier
usato dalla procedura durante le ricorsioni. Prima del ciclo ricorsivo verifica se tier = 0
e 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 DROP
eseguo la MEMORY
tabella 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 DROP
alla fine ...
Invece di chiamare semplicemente la procedura memorizzata e utilizzare la tabella TEMP rimanente per raccogliere i risultati nella query effettiva, ho modificato il CALL
formato per utilizzare una terza OUT
variabile in questo modo:
CALL fetch_inheritance_groups('abc123','0',@IDS);
... poi all'interno della procedura memorizzata, ho aggiunto un secondo IF tier = 0
alla 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ù :)
DROP
la MEMORIA temporanea tavolo. Presumo correttamente?