JavaRush /Курси /SQL SELF /Робота з тимчасовими таблицями в PostgreSQL

Робота з тимчасовими таблицями в PostgreSQL

SQL SELF
Рівень 18 , Лекція 3
Відкрита

Тимчасові таблиці — це таблиці, які існують тільки в межах поточної сесії або транзакції. Як тільки твоя сесія завершиться (або транзакція буде закрита), тимчасова таблиця і її дані зникнуть, як слід на піску. Вони ідеальні для тимчасового зберігання даних, проміжних обчислень або підготовки даних для складних операцій.

Навіщо вони потрібні?

  • Тимчасове зберігання даних: Наприклад, у тебе є складні обчислення над даними, які треба виконувати в декілька етапів. Замість того щоб навантажувати основну таблицю, можна використати тимчасові таблиці.
  • Аналіз даних: Ти можеш зібрати дані з кількох джерел, обробити їх, а потім видалити тимчасову таблицю після завершення аналізу.
  • Оптимізація складних запитів: Іноді краще розбити запит на кілька етапів із використанням тимчасових таблиць, щоб прискорити його виконання.
  • Мінімізація ризиків: Немає ризику випадково зіпсувати реальні таблиці — тимчасові таблиці повністю ізольовані.

Магія тимчасових таблиць у тому, що їхні дані видно тільки тобі! Інші користувачі бази даних не зможуть зазирнути в них, що робить тимчасові таблиці безпечними для експериментів.

Створення тимчасових таблиць

Створення тимчасової таблиці схоже на створення звичайної таблиці, тільки додається ключове слово TEMP або TEMPORARY.

Синтаксис:

CREATE TEMP TABLE table_name (
    column_name data_type constraints,
    ...
);

Все просто, правда? Тимчасова таблиця зникне автоматично після завершення твоєї сесії.

Як приклад, створимо тимчасову таблицю для зберігання даних про студентів:

CREATE TEMP TABLE temp_students (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER CHECK (age > 0)
);

Тепер у нас є тимчасова таблиця temp_students, у яку можна вставляти дані й працювати з ними, як із звичайною таблицею. Тільки не забудь — вона зникне, як тільки ти закриєш сесію.

Створення тимчасової таблиці з запиту

Іноді не хочеться описувати структуру тимчасової таблиці вручну — особливо якщо ти просто хочеш зберегти результат якогось запиту й попрацювати з ним. У цьому випадку допоможе форма:

CREATE TEMP TABLE ім'я_таблиці AS
SELECT ...;

Ця конструкція не тільки створює тимчасову таблицю, але одразу ж заповнює її даними із запиту.

Припустимо, ти хочеш зберегти студентів, які не записані ні на один курс:

CREATE TEMP TABLE temp_unregistered_students AS
    SELECT s.id, s.name
    FROM students s
    LEFT JOIN enrollments e ON s.id = e.student_id
    WHERE e.student_id IS NULL;

Тепер у тебе є таблиця temp_unregistered_students, яку можна використовувати в інших частинах скрипта — без необхідності повторювати запит.

Навіщо це?

  • Не треба явно вказувати стовпці й типи — PostgreSQL сам визначить їх із результату SELECT.
  • Можна багаторазово використовувати тимчасові дані без повторних обчислень.
  • Це особливо корисно в звітах, ETL-операціях та аналітиці.

Тимчасові таблиці всередині транзакцій

Тимчасові таблиці можна створювати всередині транзакцій. У цьому випадку вони будуть автоматично видалені, як тільки транзакція завершиться. Це особливо зручно для задач, де ти хочеш бути впевненим, що тимчасові дані не залишаться в базі. Детальніше про транзакції я розповім через пару рівнів — тож поки можеш насолоджуватись безтурботним життям :P

Приклад:

BEGIN;

CREATE TEMP TABLE temp_transactions (
    transaction_id SERIAL PRIMARY KEY,
    amount NUMERIC(10, 2) NOT NULL,
    status VARCHAR(50)
);

INSERT INTO temp_transactions (amount, status)
VALUES (100.50, 'Ochikuvannya');

-- Podivymosya danni
SELECT * FROM temp_transactions;

COMMIT;
-- Teper tablicya temp_transactions znykla!

Якщо замість COMMIT ти виконаєш ROLLBACK, дані й таблиця також будуть видалені.

Використання тимчасових таблиць у реальних задачах

Приклад 1: Тимчасове об'єднання даних

Припустимо, у нас є дві таблиці: students і courses. Треба вирішити, хто зі студентів ще не записаний на курси. Ми можемо спочатку зібрати дані у тимчасову таблицю, а вже потім виконати аналіз.

CREATE TEMP TABLE temp_unregistered_students AS
	SELECT s.id, s.name
	FROM students s
	LEFT JOIN enrollments e ON s.id = e.student_id
	WHERE e.student_id IS NULL;

-- Teper mozhna pratsyuvaty z tymchasovoyu tablytseyu temp_unregistered_students.
SELECT * FROM temp_unregistered_students;

Приклад 2: Підготовка даних для звіту

Іноді треба зібрати дані з кількох таблиць, перетворити їх і підготувати звіт. Тимчасові таблиці чудово підходять для цього.

CREATE TEMP TABLE temp_sales AS
	SELECT p.product_id, p.name, SUM(s.quantity) AS total_quantity
	FROM products p
	JOIN sales s ON p.product_id = s.product_id
	GROUP BY p.product_id, p.name;

-- Stvoreno tymchasovu tablytsyu z rezultatom. Teper mozhna pobuduvaty na yii osnovi zvit:
SELECT name, total_quantity FROM temp_sales WHERE total_quantity > 50;

Фішки та особливості тимчасових таблиць

Іменування тимчасових таблиць: якщо у тебе вже є звичайна таблиця з іменем students, ти все одно можеш створити тимчасову таблицю з таким самим ім'ям! Тимчасова таблиця матиме пріоритет у межах твоєї сесії. Але це може заплутати, якщо ти забудеш, що працюєш із тимчасовою таблицею.

Оптимізація тимчасових таблиць: PostgreSQL автоматично створює індекси для стовпців з обмеженням PRIMARY KEY або UNIQUE навіть у тимчасових таблицях. Якщо треба прискорити роботу з даними, ти можеш вручну додати індекси:

CREATE INDEX idx_temp_students_age ON temp_students (age);

Видалення тимчасової таблиці: якщо ти хочеш видалити тимчасову таблицю до завершення сесії, використовуй команду DROP TABLE:

DROP TABLE temp_students;

Обсяг даних у тимчасовій таблиці: тимчасові таблиці зберігаються в пам'яті (якщо вистачає ресурсів), що робить їх набагато швидшими. Але пам'ятай, що занадто великі дані можуть почати використовувати диск.

Часті помилки та як їх уникнути

Помилка 1: "Таблиця вже існує"

Якщо ти спробуєш створити тимчасову таблицю з іменем, яке вже зайняте іншою тимчасовою таблицею, отримаєш помилку. Використовуй CREATE TEMP TABLE IF NOT EXISTS або видали таблицю перед створенням:

DROP TABLE IF EXISTS temp_students;
CREATE TEMP TABLE temp_students (...);

Помилка 2: "Таблиця зникає занадто рано"

Якщо ти створюєш тимчасову таблицю всередині транзакції, не забувай, що вона зникне, коли транзакція завершиться. Плануй свої дії заздалегідь!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ