Я використовую рекурсивну збережену процедуру в MySQL для генерування тимчасової таблиці під назвою id_list
, але я повинен використовувати результати цієї процедури для подальшого вибору запиту, тому я не можу DROP
тимчасову таблицю в рамках процедури ...
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;
При виклику процедури перше значення - це верхній ідентифікатор потрібної мені гілки, а друге - це те, tier
що процедура використовує під час рекурсій. Перед рекурсивним циклом він перевіряє, чи tier = 0
працює він:
DROP TEMPORARY TABLE IF EXISTS id_list;
CREATE TEMPORARY TABLE IF NOT EXISTS id_list (iid CHAR(32) NOT NULL) ENGINE=memory;
Отже, моє запитання таке: Якщо я не буду DROP
тимчасової MEMORY
таблиці в кінці процедури або в рамках моєї транзакції, як довго ця таблиця збережеться в пам'яті? Чи автоматично відміняється після закінчення сеансу, чи залишиться в пам'яті, поки з'єднання відкрите?
** Примітка. Очевидною відповіддю може бути відкинути таблицю тимчасових тем перед початком заяви, але давайте на мить припустити, що я не можу цього зробити. *
EDIT : Якщо бути більш точним, що, якщо застосовуються стійкі з'єднання, таблиця зберігатиметься через кілька запитів? Поки здається, що це буде і що нам потрібно буде явно видалити темп-таблицю, щоб звільнити цей ресурс.
ОНОВЛЕННЯ : Спираючись на поради коментаторів, я знайшов спосіб коригувати свою збережену процедуру, щоб я міг використовувати таблицю ПАМ’ЯТЬ ТЕМП, але зможу явно DROP
це в кінці ...
Замість того, щоб просто викликати збережену процедуру та використовувати решту таблиці TEMP для збору результатів у фактичному запиті, я змінив CALL
формат на використання третьої OUT
змінної, наприклад:
CALL fetch_inheritance_groups('abc123','0',@IDS);
... тоді в межах збереженої процедури я додав секунду IF tier = 0
в самому кінці з наступним:
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;
Таким чином, результат збереженої процедури тепер є розділеним комою списком ідентифікаторів, сумісних з FIND_IN_SET
, і таким чином остаточний запит було змінено таким чином:
WHERE r.Group_ID = 'abc123' OR r.Group_ID IN (SELECT * FROM id_list)
... зараз ...
WHERE r.Group_ID = 'abc123' OR FIND_IN_SET(r.Group_ID,@IDS)
Вуаля! Дякую коментаторам за ваш внесок і за те, що ви мені пояснили, що мені потрібно було постаратися трохи важче :)
DROP
тимчасової ПАМ'ЯТІ стіл. Чи правильно я припускаю?