Когда стирается TEMPRORARY TABLE?

Работаю с MariaDB 10.6. Создал хранимую процедуру, а рамках которой создавалась временная таблица:

CREATE
    DEFINER = root@localhost PROCEDURE my_procedure()
BEGIN
    START TRANSACTION;

    CREATE TEMPORARY TABLE IF NOT EXISTS my_temp_table AS (SELECT id FROM some_table);

    # some logic

    COMMIT;
END;

У меня создалось впечатление, что эта таблица не стирается сразу по завершении процедуры, потому что у меня были некоторые проблемы с её использованием. После того, как я сделал удаление таблицы перед её созданием, все ошибки ушли:

DROP TABLE IF EXISTS my_temp_table;
CREATE TEMPORARY TABLE IF NOT EXISTS my_temp_table AS (SELECT id FROM some_table);

Вопрос следующий: когда именно стирается TEMPORARY TABLE, если мы создаём её в рамках процедуры?

На сайте MariaDB написано следующее:

Use the TEMPORARY keyword to create a temporary table that is only available to the current session. Temporary tables are dropped when the session ends. Temporary table names are specific to the session.

Но разве по завершении процедуры сессия не должна закрываться?


Ответы (1 шт):

Автор решения: Akina

Но разве по завершении процедуры сессия не должна закрываться?

Cессия с точки зрения клиента - это соединение с БД, и для её закрытия нужен Connection.Close.

Если ты после выполнения процедуры не закрываешь соединение и держишь его, то сессия открыта, и таблица висит и никуда не девается.

Другое дело если соединение явно закрывается. Ну или сессия может быть закрыта сервером - по тайм-ауту, скажем, если клиент завис, или если соединение кильнули. Вот тогда и таблица вместе с соединением уходит в небытие.

Кстати, тут бывает и медвежья услуга. Соединение можно настроить на автопереподключение при обрыве - но после переподключения темптаблицы уже не будет...

→ Ссылка