Dočasné tabulky v MySQL: Vytvoření, použití, odstranění + osvědčené postupy (s příklady SQL)

目次

1. (Pro začátečníky) Co je dočasná tabulka MySQL? Rozdíly oproti běžným tabulkám

Úvod

Při správě dat v MySQL se občas setkáte s potřebou uložit data jen dočasně. Například při zpracování velké datové sady můžete chtít během práce uložit mezivýsledky. V takových případech je dočasná tabulka (Temporary Table) velmi užitečná.

V tomto článku vysvětlíme základní principy dočasných tabulek MySQL a jak se liší od běžných tabulek.

1-1. Co je dočasná tabulka?

Dočasná tabulka je speciální tabulka, která existuje pouze během databázové relace (spojení).
Na rozdíl od běžné tabulky je automaticky odstraněna po ukončení relace, což ji činí ideální pro ukládání dočasných dat.

Hlavní vlastnosti dočasných tabulek

  • Izolována podle relace Dočasná tabulka je přístupná pouze v rámci relace, která ji vytvořila. Ostatní relace ji nemohou odkazovat.
  • Automaticky odstraněna po ukončení relace Dočasné tabulky zmizí automaticky po skončení relace, i když je explicitně neodstraníte.
  • Můžete vytvořit dočasné tabulky se stejným názvem Na rozdíl od běžných tabulek je možné vytvořit dočasné tabulky se stejným názvem v různých relacích.

1-2. Rozdíly oproti běžným tabulkám

Dočasné tabulky a běžné tabulky se liší následujícím způsobem.

ComparisonTemporary TableRegular Table
Data retentionValid only during the session (automatically removed)Stored permanently
Access scopeOnly within the session that created itAccessible to all users (subject to privileges)
Name conflictsYou can create temporary tables with the same nameYou cannot create another table with the same name in the same database
Required privilegesRequires the CREATE TEMPORARY TABLES privilegeRequires the standard CREATE TABLE privilege
IndexesSupportedSupported
PerformanceOften created in memory and can be fastStored on disk; performance can degrade as data grows

Kterou byste měli použít?

  • Pokud potřebujete data jen dočasně a můžete je po zpracování zahoditDočasná tabulka
  • Pokud chcete data uchovat trvale a později je znovu použítBěžná tabulka

Například dočasné tabulky jsou velmi užitečné pro úlohy jako rozsáhlá analýza dat nebo dočasná agregace.

1-3. Kdy potřebujete dočasnou tabulku

Dočasné tabulky MySQL jsou zvláště užitečné v následujících situacích.

1) Zlepšení výkonu dotazu

Například při provádění složitých operací JOIN můžete snížit dobu zpracování vytvořením dočasné tabulky, která předem uloží mezidata.

Příklad: Snížení režie JOIN
CREATE TEMPORARY TABLE temp_users AS
SELECT id, name FROM users WHERE status = 'active';

Uložením cílových dat nejprve do dočasné tabulky a následným provedením JOIN se může výkon zlepšit.

2) Dočasné ukládání dat

Dočasné tabulky jsou také užitečné, když aplikace potřebuje data spravovat dočasně. Například můžete uložit data, která uživatel vyhledal, do dočasné tabulky a po ukončení relace je nechat odstranit.

3) Mezilehlé tabulky pro dávkové zpracování

Při zpracování velkého množství dat může použití dočasných tabulek jako mezilehlých tabulek zlepšit stabilitu procesu.

1-4. Omezení dočasných tabulek

Dočasné tabulky jsou pohodlné, ale mají několik omezení.

1) Automaticky odstraněny po ukončení relace

Protože jsou dočasné tabulky automaticky odstraněny po ukončení relace, nejsou vhodné pro trvalé ukládání dat.

2) Nepřístupné z jiných relací

Dočasné tabulky lze použít pouze v rámci relace, která je vytvořila, a proto je nelze sdílet s ostatními uživateli nebo procesy.

3) Potenciální konflikt s běžnou tabulkou se stejným názvem

Pokud existuje běžná tabulka se stejným názvem, vytvoření dočasné tabulky s tímto názvem způsobí, že běžná tabulka bude dočasně neviditelná, proto buďte opatrní.

CREATE TEMPORARY TABLE users (id INT, name VARCHAR(255));
SELECT * FROM users; -- This query references the temporary table data

Jak je uvedeno výše, jakmile je vytvořena dočasná tabulka, nemůžete přistupovat k běžné tabulce se stejným názvem, dokud dočasná tabulka nezmizí. Volte názvy tabulek opatrně.

Shrnutí

Dočasné tabulky MySQL jsou pohodlnou funkcí pro dočasné ukládání dat a optimalizaci dotazů. Pokud pochopíte, jak se liší od běžných tabulek a budete je používat správně, můžete zpracovávat data efektivněji.

✔ Quick recap

  • Dočasné tabulky jsou automaticky odstraněny po ukončení relace
  • Na rozdíl od běžných tabulek jsou izolovány pro každou relaci
  • Skvělé pro dočasné ukládání a zlepšení výkonu dotazů
  • Nevhodné pro trvalé ukládání, protože data zmizí po ukončení relace
  • Není k dispozici z jiných relací a může docházet ke konfliktu s běžnými tabulkami se stejným názvem

2. (S ukázkovým kódem) Jak vytvořit dočasnou tabulku v MySQL

Introduction

V předchozí sekci jsme vysvětlili základní koncept dočasných tabulek a jak se liší od běžných tabulek.
V této sekci si projdeme, jak vytvořit dočasnou tabulku a jak s daty v ní pracovat.

Vytvoření dočasné tabulky je jednoduché, ale pokud nepoužijete správnou syntaxi, nemusí se chovat podle očekávání. Tato sekce podrobně vysvětluje základní syntaxi, vytváření z existující tabulky a jak ověřit dočasné tabulky.

2-1. Basic Syntax for a Temporary Table

Pro vytvoření dočasné tabulky použijte příkaz CREATE TEMPORARY TABLE.

Basic syntax

CREATE TEMPORARY TABLE table_name (
    column_name data_type [constraints],
    column_name data_type [constraints],
    ...
);

Syntaxe je téměř stejná jako CREATE TABLE, ale přidání TEMPORARY ji učiní dočasnou tabulkou.

Example: Store user information in a temporary table

CREATE TEMPORARY TABLE temp_users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

Tato tabulka temp_users je platná pouze v aktuální relaci a je automaticky odstraněna po ukončení relace.

2-2. Create a Temporary Table Based on Data from an Existing Table

Můžete také vytvořit dočasnou tabulku na základě dat z existující tabulky.

Syntax

CREATE TEMPORARY TABLE temp_table_name AS
SELECT * FROM existing_table WHERE condition;

Example: Store only active users in a temporary table

CREATE TEMPORARY TABLE active_users AS
SELECT id, name, email FROM users WHERE status = 'active';

Tato metoda vyextrahuje pouze uživatele s status = 'active' z tabulky users a uloží je do nové dočasné tabulky s názvem active_users.

Key points
  • Kopíruje data z existující tabulky tak, jak jsou
  • Datové typy sloupců jsou nastaveny automaticky
  • Indexy nejsou zkopírovány, takže je v případě potřeby přidejte explicitně

2-3. How to Check Temporary Table Data

List tables

SHOW TABLES;

Nicméně dočasná tabulka se v seznamu získaném pomocí běžného SHOW TABLES neobjeví.

Check the structure of a temporary table

DESC temp_users;

or

SHOW CREATE TABLE temp_users;

To vám umožní zkontrolovat strukturu sloupců a omezení dočasné tabulky.

2-4. Insert Data into a Temporary Table

Vkládání dat do dočasné tabulky je stejné jako u běžné tabulky.

Insert data

INSERT INTO temp_users (name, email) VALUES 
('Taro Tanaka', 'tanaka@example.com'),
('Hanako Sato', 'sato@example.com');

Check the data

SELECT * FROM temp_users;

Tím se potvrzuje, že data byla uložena v dočasné tabulce.

2-5. Notes When Creating Temporary Tables

1) Watch out for table name conflicts

Pokud vytvoříte dočasnou tabulku se stejným názvem jako běžná tabulka, dočasná tabulka má přednost a běžná tabulka se stane dočasně nedostupnou.

CREATE TEMPORARY TABLE users (id INT, name VARCHAR(50));
SELECT * FROM users; -- This returns data from the temporary table

Z tohoto důvodu se doporučuje používat předponu jako „temp_“ pro názvy dočasných tabulek.

2) Indexes are not inherited automatically

Když kopírujete data z existující tabulky, indexy se nepoužijí automaticky.
V případě potřeby je musíte přidat explicitně.

ALTER TABLE temp_users ADD INDEX (email);

3) Potřebujete oprávnění k vytvoření dočasných tabulek

To create a temporary table, you need the CREATE TEMPORARY TABLES privilege.

GRANT CREATE TEMPORARY TABLES ON database_name.* TO 'user'@'localhost';

Without this privilege, you cannot create temporary tables.

Shrnutí

In this section, we explained how to create temporary tables.

✔ Rychlý přehled

  • Vytvořte dočasnou tabulku pomocí CREATE TEMPORARY TABLE
  • Můžete ji také vytvořit zkopírováním dat z existující tabulky
  • Automaticky odstraněna, když se sezení ukončí
  • Indexy se nepoužívají automaticky—buďte opatrní
  • Použijte předponu jako „temp_“, abyste se vyhnuli konfliktům názvů
  • Potřebujete příslušné oprávnění (CREATE TEMPORARY TABLES)

3. Jak manipulovat s daty v MySQL dočasné tabulce (INSERT, UPDATE, DELETE)

Úvod

V předchozí sekci jsme vysvětlili, jak vytvořit dočasnou tabulku v MySQL.
V této sekci vysvětlíme, jak vkládat, aktualizovat a mazat data v dočasné tabulce pomocí konkrétních SQL příkazů.

Dočasné tabulky podporují stejné operace s daty jako běžné tabulky,
ale existují některé důležité poznámky, na které je třeba si dát pozor, a které také probereme.

3-1. Vkládání dat do dočasné tabulky (INSERT)

Pro přidání dat do dočasné tabulky použijte příkaz INSERT INTO, stejně jako u běžné tabulky.

Základní syntaxe

INSERT INTO temp_table_name (column1, column2, ...) 
VALUES (value1, value2, ...);

Příklad: Přidání informací o uživateli

CREATE TEMPORARY TABLE temp_users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO temp_users (name, email) 
VALUES 
('Taro Tanaka', 'tanaka@example.com'),
('Hanako Sato', 'sato@example.com');

Vložení existujících dat pomocí INSERT…SELECT

Můžete také načíst data z existující tabulky a vložit je do dočasné tabulky.

INSERT INTO temp_users (id, name, email)
SELECT id, name, email FROM users WHERE status = 'active';

This method lets you store only active users in a temporary table.

3-2. Aktualizace dat v dočasné tabulce (UPDATE)

Pro změnu dat v dočasné tabulce použijte příkaz UPDATE.

Základní syntaxe

UPDATE temp_table_name 
SET column_name = value
WHERE condition;

Příklad: Aktualizace jména uživatele

UPDATE temp_users 
SET name = 'Ichiro Tanaka'
WHERE email = 'tanaka@example.com';

Hromadná aktualizace řádků, které splňují podmínku

Například, pokud chcete změnit e‑mailové adresy pod konkrétní doménou na example.jp, můžete napsat:

UPDATE temp_users 
SET email = REPLACE(email, 'example.com', 'example.jp')
WHERE email LIKE '%@example.com';

3-3. Mazání dat z dočasné tabulky (DELETE)

Pro smazání dat použijte příkaz DELETE.

Základní syntaxe

DELETE FROM temp_table_name WHERE condition;

Příklad: Smazání dat konkrétního uživatele

DELETE FROM temp_users WHERE email = 'tanaka@example.com';

Smazání všech řádků (rozdíl od TRUNCATE)

Pokud chcete smazat všechny řádky, můžete napsat:

DELETE FROM temp_users;

Naopak u běžných tabulek můžete často smazat všechny řádky rychleji pomocí TRUNCATE TABLE. Nicméně v MySQL nemůžete použít TRUNCATE na dočasnou tabulku.

TRUNCATE TABLE temp_users; -- Error (cannot be used on temporary tables in MySQL)

Proto pro odstranění všech řádků z dočasné tabulky musíte použít DELETE.

3-4. Poznámky při manipulaci s daty v dočasné tabulce

1) Data zmizí, když sezení skončí

Dočasná tabulka je automaticky odstraněna, když sezení (spojení) skončí,
proto není vhodná pro případy, které vyžadují trvalé ukládání dat.

2) Není přístupná z jiných sezení

Dočasná tabulka je platná pouze v rámci sezení, které ji vytvořilo, a nemůže být přístupná z jiných sezení.

SELECT * FROM temp_users;

Pokud spustíte tento SQL v jiné relaci, získáte chybu „Table ‚temp_users‘ doesn’t exist“.

3) Indexy na dočasných tabulkách nejsou aplikovány automaticky

Pokud vytvoříte tabulku pomocí CREATE TEMPORARY TABLE ... AS SELECT ...,
indexy z původní tabulky nejsou zděděny. V případě potřeby přidejte indexy ručně pomocí ALTER TABLE.

ALTER TABLE temp_users ADD INDEX (email);

Shrnutí

V této sekci jsme pokryli manipulaci s daty (INSERT, UPDATE, DELETE) pro dočasné tabulky.

✔ Rychlé shrnutí

  • Použijte INSERT k přidání dat ( INSERT INTO ... VALUES / INSERT INTO ... SELECT )
  • Použijte UPDATE k úpravě dat (podmíněné aktualizace a využití REPLACE() )
  • Použijte DELETE k odstranění dat ( DELETE FROM ... WHERE ; TRUNCATE není povoleno)
  • Dočasná tabulka je odstraněna, když relace končí
  • Není přístupná z jiných relací
  • Indexy nejsou automaticky zděděny; v případě potřeby je přidejte ručně

4. Jsou dočasné tabulky MySQL automaticky odstraněny? Jak je odstranit ručně

Úvod

Na rozdíl od běžných tabulek je dočasná tabulka MySQL (Temporary Table) automaticky odstraněna, když relace končí. Existují však situace, kdy můžete potřebovat ji odstranit ručně.

V této sekci podrobně vysvětlujeme jak funguje automatické odstraňování a jak ručně odstranit dočasné tabulky.

4-1. Jak funguje automatické odstraňování pro dočasné tabulky

1) Automaticky odstraněna, když relace končí

Dočasná tabulka MySQL je automaticky odstraněna, když relace (databázové připojení), která ji vytvořila, končí.
Kvůli tomu ji obvykle nemusíte odstraňovat ručně.

Příklad: Automatické odstraňování při konci relace
-- Create a temporary table in a new session
CREATE TEMPORARY TABLE temp_users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100)
);

-- Insert data
INSERT INTO temp_users (name, email) VALUES ('Taro Tanaka', 'tanaka@example.com');

-- End the session (disconnect the MySQL client)
EXIT;

V tomto okamžiku je dočasná tabulka temp_users automaticky odstraněna.

2) Dočasná tabulka zůstává, dokud relace pokračuje

Protože dočasné tabulky jsou spravovány na úrovni relace, nejsou odstraněny, dokud je relace otevřená.

SELECT * FROM temp_users; -- Data can be retrieved if the session is still active

Jinými slovy, dočasná tabulka zůstává v paměti, dokud neukončíte MySQL klienta (nebo program neodpojí).

4-2. Jak ručně odstranit dočasnou tabulku

Dočasné tabulky můžete také odstranit ručně. V MySQL použijte DROP TEMPORARY TABLE k odstranění dočasné tabulky.

1) Použijte DROP TEMPORARY TABLE

DROP TEMPORARY TABLE temp_users;

Tím okamžitě odstraníte dočasnou tabulku temp_users.

2) Přidejte IF EXISTS pro vyhnutí se chybám

Pokud tabulka neexistuje, můžete použít IF EXISTS, abyste se vyhnuli chybě.

DROP TEMPORARY TABLE IF EXISTS temp_users;

Tato syntaxe zabraňuje chybám i v případě, že tabulka neexistuje.

3) Liší se od běžného DROP TABLE

Pokud se pokusíte odstranit dočasnou tabulku pomocí běžného DROP TABLE, můžete získat chybu jako následující:

DROP TABLE temp_users;

Error:

ERROR 1051 (42S02): Unknown table 'temp_users'

Protože MySQL spravuje běžné tabulky a dočasné tabulky odděleně, musíte při odstraňování dočasné tabulky použít DROP TEMPORARY TABLE.

4-3. Jak potvrdit, že byla dočasná tabulka odstraněna

1) Nemůžete potvrdit pomocí SHOW TABLES

Dočasná tabulka se neobjeví ve výstupu SHOW TABLES.

SHOW TABLES;

Dočasné tabulky nejsou vypsány

2) Potvrďte pomocí INFORMATION_SCHEMA

Můžete zkontrolovat, zda dočasná tabulka existuje, dotazem na INFORMATION_SCHEMA.

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = DATABASE() 
AND TABLE_NAME = 'temp_users';

Pokud tento dotaz vrátí výsledek, naznačuje to, že dočasná tabulka existuje.

4-4. Poznámky při odstraňování dočasných tabulek

1) Dočasné tabulky se liší podle relace

Můžete vytvořit dočasné tabulky se stejným názvem v několika relacích.
Nemůžete odstranit dočasnou tabulku vytvořenou jinou relací.

Příklad
-- Created in session A
CREATE TEMPORARY TABLE temp_data (id INT);

-- Attempt to drop in session B
DROP TEMPORARY TABLE temp_data;

Vyskytla se chyba:

ERROR 1051 (42S02): Unknown table 'temp_data'

Dočasnou tabulku lze odstranit pouze v relaci, která ji vytvořila.

2) Potenciální konflikt s běžnou tabulkou se stejným názvem

Pokud má dočasná tabulka stejný název jako běžná tabulka,
dočasná tabulka má přednost a běžná tabulka se stane neviditelnou.

Příklad
-- A regular table (users) exists
SELECT * FROM users;

-- Create a temporary table with the same name
CREATE TEMPORARY TABLE users (id INT, name VARCHAR(50));

-- This now references the temporary table users
SELECT * FROM users;

Řešení:

  • Použijte předponu jako temp_ pro dočasné tabulky, abyste se vyhnuli konfliktům v názvech.

Shrnutí

V této sekci jsme vysvětlili, jak funguje odstraňování dočasných tabulek a jak je odstranit.

✔ Rychlé shrnutí

  • Dočasné tabulky jsou automaticky odstraněny při ukončení relace
  • Zůstávají, dokud je relace aktivní
  • Pro ruční odstranění použijte DROP TEMPORARY TABLE
  • Přidejte IF EXISTS, aby se předešlo chybám
  • Nemůžete potvrdit existenci dočasných tabulek pomocí SHOW TABLES
  • Dočasnou tabulku můžete odstranit pouze v relaci, která ji vytvořila
  • Použijte předponu, abyste se vyhnuli konfliktům s běžnými tabulkami se stejným názvem

5. 5 Praktických případů použití dočasných tabulek MySQL (včetně optimalizace výkonu)

Úvod

Dočasné tabulky MySQL vám umožňují ukládat mezilehlá data a zjednodušovat složité dotazy, což pomáhá zlepšit výkon databáze.

V této sekci představujeme pět praktických případů použití dočasných tabulek.
Vysvětlujeme, jak je lze použít v reálných scénářích, spolu se vzorovým SQL.

5-1. Optimalizace výkonu dotazů (snížení zátěže JOIN)

Problém

Při zpracování velkých datových sad může přímé provádění operací JOIN snižovat výkon.

Řešení

Použijte dočasnou tabulku k předběžnému filtrování cílových dat před provedením JOIN, čímž snížíte zátěž zpracování.

Příklad: Získání dat objednávek pro aktivní uživatele
-- First, store only active users in a temporary table
CREATE TEMPORARY TABLE temp_active_users AS
SELECT id, name FROM users WHERE status = 'active';

-- Perform JOIN using the temporary table
SELECT o.order_id, t.name, o.total_price
FROM orders o
JOIN temp_active_users t ON o.customer_id = t.id;
Výhody
  • Snižuje zátěž JOIN tím, že cílí pouze na aktivní uživatele místo celé tabulky users
  • Zjednodušuje hlavní dotaz, zlepšuje čitelnost

5-2. Dočasné zpracování agregací

Problém

Opakované spouštění stejného agregačního dotazu může snižovat výkon.

Řešení

Uložte výsledky agregace jednou do dočasné tabulky, abyste předešli zbytečným opakovaným výpočtům.

Příklad: Uložení měsíčních prodejních dat do dočasné tabulky
-- Calculate monthly total sales and store in a temporary table
CREATE TEMPORARY TABLE temp_monthly_sales AS
SELECT DATE_FORMAT(order_date, '%Y-%m') AS month, SUM(total_price) AS total_sales
FROM orders
GROUP BY month;

-- Retrieve aggregated results
SELECT * FROM temp_monthly_sales WHERE total_sales > 100000;
Výhody
  • Znovu použít agregovaná data vícekrát
  • Zlepšit výkon vyhnutím se redundantním výpočtům

5-3. Ukládání mezilehlých dat pro dávkové zpracování

Problém

When performing bulk updates or deletes, errors during processing can leave data in an inconsistent state.

Solution

Use a temporary table to store intermediate data and maintain data consistency.

Example: Update order data under specific conditions
-- Store target rows in a temporary table
CREATE TEMPORARY TABLE temp_orders AS
SELECT order_id, total_price FROM orders WHERE status = 'pending';

-- Perform update based on the temporary table
UPDATE orders o
JOIN temp_orders t ON o.order_id = t.order_id
SET o.total_price = t.total_price * 1.1; -- Increase price by 10%
Benefits
  • Safely update only selected data
  • Easy to verify data before and after updates

5-4. Per-User Temporary Data Management

Problem

If temporary user-specific data is stored in a regular table, unnecessary data may accumulate over time.

Solution

Temporary tables automatically remove data when the session ends, eliminating maintenance overhead.

Example: Store search results in a temporary table
-- Store user-specific search results
CREATE TEMPORARY TABLE temp_search_results AS
SELECT * FROM products WHERE category = 'electronics';

-- Display search results
SELECT * FROM temp_search_results;
Benefits
  • Data is automatically removed when the session ends
  • Temporary search results can be reused during the session

5-5. Choosing Between Temporary Tables and Views

Problem

When optimizing frequently executed queries, you may wonder whether to use a temporary table or a VIEW, especially if temporary data storage is required.

Solution

  • If data does not change frequentlyUse a view (VIEW)
  • If data changes frequently or needs materializationUse a temporary table
Example: Using a temporary table
CREATE TEMPORARY TABLE temp_high_value_customers AS
SELECT customer_id, SUM(total_price) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 50000;

SELECT * FROM temp_high_value_customers;
Example: Using a view
CREATE VIEW high_value_customers AS
SELECT customer_id, SUM(total_price) AS total_spent
FROM orders
GROUP BY customer_id
HAVING total_spent > 50000;
Benefits
  • Temporary tables store data physically, which can improve performance
  • Views are convenient for query reuse, but performance may decrease with large datasets

Summary

In this section, we introduced five practical use cases for MySQL temporary tables.

✔ Quick recap

  1. Optimize query performance (reduce JOIN overhead) → Store only required data in a temporary table before performing JOIN
  2. Temporary aggregation processing → Store aggregated results to avoid repeated calculations
  3. Intermediate data for batch processing → Safely handle large-scale updates
  4. Per-user temporary data management → Data is automatically removed when the session ends
  5. Choose between temporary tables and views → Use temporary tables for changing data, views for stable query reuse

6. Three Important Precautions When Using MySQL Temporary Tables Safely

Introduction

MySQL temporary tables operate independently per session and are automatically removed under certain conditions, making them a convenient feature. However, improper use can lead to performance degradation or unexpected errors.

In this section, we explain three important precautions to ensure safe use of temporary tables.

6-1. Precaution 1: Do Not Over-Rely on Automatic Removal

Problem

Because temporary tables are automatically removed when the session ends, it may seem unnecessary to drop them explicitly. However, this can sometimes

  • Dlouho běžící spojení nadále spotřebovávají paměť
  • Pokud zůstane relace otevřená, dočasné tabulky nejsou odstraněny a nadále spotřebovávají prostředky databáze.
  • Nedostatečné explicitní odstranění může způsobit konstrukční chyby
  • Pokud se dávkový proces neočekávaně znovu připojí, dočasná tabulka může zmizet a způsobit chyby.

Řešení

  • Explicitně odstraňte dočasné tabulky, když již nejsou potřeba, pomocí DROP TEMPORARY TABLE
  • V dlouho běžících spojeních (např. dávkové úlohy) odstraňujte dočasné tabulky periodicky
Příklad: Explicitně odstranit dočasnou tabulku
DROP TEMPORARY TABLE IF EXISTS temp_users;

Klíčový bod

  • Přidání IF EXISTS zabraňuje chybám, pokud tabulka neexistuje.

6-2. Opatření 2: Vyhnout se konfliktům názvů s běžnými tabulkami

Problém

Můžete vytvořit dočasnou tabulku se stejným názvem jako běžná tabulka. Avšak když tak učiníte, běžná tabulka se stane dočasně neviditelnou.

Příklad problému

-- A regular users table exists
SELECT * FROM users;

-- Create a temporary table with the same name
CREATE TEMPORARY TABLE users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- This now returns data from the temporary table, not the regular one
SELECT * FROM users;

Dokud existuje dočasná tabulka, běžná tabulka se stejným názvem je skryta, což může vést k neočekávaným chybám při načítání dat.

Řešení

  • Používejte předponu jako „temp_“ pro názvy dočasných tabulek
  • Zavést jasnou konvenci pojmenování, která odliší dočasné a běžné tabulky
Příklad: Bezpečné vytvoření dočasné tabulky
CREATE TEMPORARY TABLE temp_users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

Výhody

  • Použití předpony temp_ zabraňuje konfliktům s běžnou tabulkou users.
  • Usnadňuje rozlišení tabulek v aplikačním kódu.

6-3. Opatření 3: Indexy a omezení nejsou automaticky zděděny

Problém

Pokud vytvoříte tabulku pomocí CREATE TEMPORARY TABLE ... AS SELECT ..., indexy a omezení z původní tabulky nejsou zděděny, což může snížit výkon.

Příklad problému

-- Regular users table (with indexes)
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(100) UNIQUE,
    name VARCHAR(50)
);

-- Create temporary table (indexes are NOT inherited)
CREATE TEMPORARY TABLE temp_users AS
SELECT id, email, name FROM users;

V tomto případě nejsou PRIMARY KEY a UNIQUE omezení přeneseny do temp_users, což může zpomalit vyhledávání a umožnit duplicitní data.

Řešení

  • Explicitně přidejte indexy po vytvoření dočasné tabulky
  • Pokud definujete sloupce ručně pomocí CREATE TEMPORARY TABLE, specifikujte indexy během vytváření
Příklad: Přidat indexy ručně
CREATE TEMPORARY TABLE temp_users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(100) UNIQUE,
    name VARCHAR(50)
);

ALTER TABLE temp_users ADD INDEX idx_email (email);

Tento přístup vám umožní vytvořit dočasnou tabulku s indexy podobnými původní tabulce.

Shrnutí

V této sekci jsme vysvětlili tři důležitá opatření pro bezpečné používání dočasných tabulek.

✔ Rychlý přehled

  1. Nespoléhejte se nadměrně na automatické odstraňování
  • Explicitně odstraňujte dočasné tabulky pomocí DROP TEMPORARY TABLE
  • Periodicky je odstraňujte v dlouho běžících relacích
  1. Vyhněte se konfliktům názvů s běžnými tabulkami
  • Pokud existuje běžná tabulka se stejným názvem, dočasná tabulka má přednost
  • Použijte předponu jako temp_ pro jasné rozlišení
  1. Indexy a omezení nejsou automaticky zděděny
  • Při použití CREATE TEMPORARY TABLE ... AS SELECT ... jsou indexy ztraceny
  • Přidejte indexy ručně po vytvoření

Pokud budete mít tyto body na paměti, můžete bezpečně využívat dočasné tabulky MySQL a zároveň zlepšit výkon databáze.

7. 10 Často kladených otázek (FAQ) o dočasných tabulkách MySQL

Úvod

V této sekci odpovídáme na 10 často kladených otázek o dočasných tabulkách MySQL.
Pokrýváme jak fungují, jejich omezení, výkonnostní úvahy a řešení problémů v praktických scénářích.

7-1. Otázky o základních specifikacích

Q1. Lze dočasnou tabulku přistupovat z jiné relace?

A. Ne, nelze.
Dočasná tabulka je platná pouze v rámci relace, která ji vytvořila, a nelze k ní přistupovat z jiných relací.

-- Created in Session A
CREATE TEMPORARY TABLE temp_users (
    id INT PRIMARY KEY,
    name VARCHAR(50)
);

-- Attempt to access from Session B (results in error)
SELECT * FROM temp_users;

Chyba:

ERROR 1146 (42S02): Table 'temp_users' doesn't exist

Pokud potřebujete sdílet data mezi relacemi, musíte použít běžnou tabulku.

Q2. Jsou dočasné tabulky ukládány na disk?

A. Obvykle jsou ukládány v paměti, ale mohou být přesunuty na disk za určitých podmínek.
Pokud velikost tabulky překročí tmp_table_size nebo max_heap_table_size, MySQL může vytvořit dočasnou tabulku na disku pomocí InnoDB nebo MyISAM.

SHOW VARIABLES LIKE 'tmp_table_size';

Pro zlepšení výkonu nakonfigurujte tmp_table_size vhodně.

Q3. Mohu vytvořit indexy na dočasné tabulce?

A. Ano, můžete.
Můžete definovat PRIMARY KEY nebo INDEX stejně jako u běžné tabulky.

CREATE TEMPORARY TABLE temp_users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(100) UNIQUE,
    name VARCHAR(50)
);

ALTER TABLE temp_users ADD INDEX idx_email (email);

Nicméně, pokud použijete CREATE TEMPORARY TABLE ... AS SELECT ..., indexy nejsou zděděny, takže je musíte přidat ručně.

7-2. Otázky o výkonu a chování

Q4. Existují změny v dočasných tabulkách v MySQL 8.0?

A. MySQL 8.0 zavedla Common Table Expressions (CTE) pomocí klauzule WITH.
Od MySQL 8.0 můžete zpracovávat dočasné výsledkové sady pomocí CTE, aniž byste explicitně vytvářeli dočasnou tabulku.

WITH temp_users AS (
    SELECT id, name FROM users WHERE status = 'active'
)
SELECT * FROM temp_users;

Použití CTE místo dočasných tabulek může zjednodušit dotazy a snížit využití paměti.

Q5. Jaký je rozdíl mezi dočasnou tabulkou a tabulkou MEMORY?

A. Tabulka MEMORY přetrvává i po ukončení relace, zatímco dočasná tabulka ne.
Dočasná tabulka je odstraněna, když relace skončí, zatímco tabulka MEMORY zůstává až do restartu serveru (nebo je explicitně odstraněna).

CREATE TABLE memory_table (
    id INT PRIMARY KEY,
    name VARCHAR(50)
) ENGINE=MEMORY;

Kdy použít kterou?

  • Dočasná tabulka: Krátkodobé zpracování v rámci relace
  • MEMORY tabulka: Vysoce rychlý přístup se serverovou perzistencí

7-3. Otázky o mazání a řešení problémů

Q6. Mohu odstranit dočasnou tabulku pomocí DROP TABLE?

A. Ne, musíte použít DROP TEMPORARY TABLE.
Vždy použijte DROP TEMPORARY TABLE při odstraňování dočasné tabulky.

DROP TEMPORARY TABLE temp_users;

Použití běžného DROP TABLE může vést k chybě.

Q7. Proč SHOW TABLES nezobrazuje dočasné tabulky?

A. Dočasné tabulky nejsou uvedeny v SHOW TABLES.
Pro kontrolu jejich existence dotazujte INFORMATION_SCHEMA.

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA = DATABASE() 
AND TABLE_NAME = 'temp_users';

Pokud není vrácen žádný výsledek, dočasná tabulka mohla být již odstraněna.

Shrnutí

V této sekci jsme pokryli 10 často kladených otázek o dočasných tabulkách MySQL.

✔ Rychlý přehled

  1. Dočasné tabulky nelze přistupovat z jiných relací
  2. Jsou vytvořeny v paměti, ale mohou se přesunout na disk, pokud jsou velké
  3. Indexy je třeba definovat ručně, pokud se používá AS SELECT
  4. CTE (WITH) jsou k dispozici v MySQL 8.0+
  5. Na rozdíl od MEMORY tabulek, dočasné tabulky zmizí na konci relace
  6. Použijte DROP TEMPORARY TABLE k jejich odstranění
  7. SHOW TABLES nezobrazuje dočasné tabulky

8. Shrnutí: Klíčové body pro efektivní používání dočasných tabulek MySQL

Úvod

Dočasné tabulky MySQL jsou výkonný nástroj pro ukládání mezilehlých dat a optimalizaci výkonu dotazů.
Zde shrnujeme klíčové body, které byly v tomto průvodci diskutovány.

8-1. Základní koncepty dočasných tabulek MySQL

Co je dočasná tabulka?

  • Existuje nezávisle pro každou relaci
  • Je automaticky odstraněna při ukončení relace
  • Podporuje INSERT, UPDATE a DELETE jako běžná tabulka

Základní syntaxe vytvoření

CREATE TEMPORARY TABLE temp_users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    email VARCHAR(100)
);

Hlavní případy použití

  • Dočasné ukládání dat
  • Optimalizace výkonu dotazů
  • Mezilehlé tabulky pro dávkové zpracování
  • Správa dočasných dat na úrovni uživatele

8-2. Výhody dočasných tabulek

1) Zlepšení výkonu dotazů

  • Snížení zátěže JOIN operací
  • Provádění agregace předem pro snížení opakovaných výpočtů
  • Zjednodušení dotazů vyloučením nepotřebných dat
Příklad: Snížení zátěže JOIN
CREATE TEMPORARY TABLE temp_active_users AS
SELECT id, name FROM users WHERE status = 'active';

SELECT o.order_id, t.name, o.total_price
FROM orders o
JOIN temp_active_users t ON o.customer_id = t.id;

2) Dočasné ukládání a správa na úrovni relace

  • Automaticky odstraněno na konci relace
  • Ideální pro krátkodobé ukládání dat
  • Nezávislá manipulace s daty, aniž by ovlivňovala jiné relace
Příklad: Dočasné ukládání výsledků vyhledávání
CREATE TEMPORARY TABLE temp_search_results AS
SELECT * FROM products WHERE category = 'electronics';

SELECT * FROM temp_search_results;

3) Bezpečné aktualizace dat

  • Užitečné jako mezilehlá tabulka při dávkovém zpracování
  • Může sloužit jako záloha během aktualizací dat
  • Efektivní pro tvorbu testových datových sad
Příklad: Bezpečná aktualizace dat
CREATE TEMPORARY TABLE temp_orders AS
SELECT order_id, total_price FROM orders WHERE status = 'pending';

UPDATE orders o
JOIN temp_orders t ON o.order_id = t.order_id
SET o.total_price = t.total_price * 1.1;

8-3. Nevýhody a opatření

1) Data zmizí po ukončení relace

  • Nevhodné pro trvalé ukládání
  • Použijte běžné tabulky pro dlouhodobou perzistenci

2) Nelze sdílet mezi relacemi

  • Není přístupné z jiných spojení
  • Použijte běžné tabulky při sdílení dat mezi uživateli

3) Indexy a omezení nejsou automaticky zděděny

  • CREATE TEMPORARY TABLE ... AS SELECT ... nevytváří indexy
  • Přidejte indexy ručně, pokud jsou potřeba
    ALTER TABLE temp_users ADD INDEX idx_email (email);
    

8-4. Nejlepší postupy pro bezpečné používání

Explicitně odstranit, když již není potřeba

DROP TEMPORARY TABLE IF EXISTS temp_users;

Vyhněte se kolizím názvů s běžnými tabulkami

  • Použijte předponu temp_
    CREATE TEMPORARY TABLE temp_users (...);
    

Navrhněte s ohledem na výkon

  • Pokud tabulka naroste a přesune se na disk, zvažte úpravu tmp_table_size
    SHOW VARIABLES LIKE 'tmp_table_size';
    

8-5. Dočasné tabulky vs alternativy (pohledy a CTE)

Je také důležité zvážit, kdy použít dočasné tabulky oproti pohledům (VIEW) nebo CTE (Common Table Expressions).

MethodCharacteristicsBest Use Case
Temporary tableRemoved at session endWhen you need to store intermediate data
View (VIEW)Data retrieved in real time; performance may degrade with large datasetsSave and reuse frequently referenced queries
CTE (WITH clause)Virtual table valid only within a single queryHandle temporary data without creating a table

Shrnutí

V tomto průvodci jsme pokryli všechny klíčové aspekty dočasných tabulek MySQL.

✔ Rychlý přehled

  • Dočasné tabulky jsou automaticky odstraněny po ukončení relace
  • Pomáhají optimalizovat výkon snížením režie JOIN a agregací
  • Užitečné pro dávkové zpracování, dočasné výsledky vyhledávání a testovací data
  • Nelze je sdílet mezi relacemi a indexy je třeba přidávat ručně, pokud jsou potřeba
  • Volba mezi dočasnými tabulkami, pohledy a CTE umožňuje flexibilní správu dat

Nyní jste dokončili všechny sekce průvodce dočasnými tabulkami v MySQL! 🎉
Použijte tento odkaz k efektivnímu využití dočasných tabulek ve vašich MySQL projektech.