Mysql
 sql >> Database >  >> RDS >> Mysql

Inserisci tabella MySQL Temp

lavorando su ciò che Code-Monk ha scritto, considera quanto segue:

drop procedure if exists uspK;
DELIMITER $$
create procedure uspK ()
BEGIN
    drop temporary table if exists temp; -- could be some other random structure residue

    create temporary table temp
    SELECT aID, bID
    FROM tags
    WHERE placeID = "abc" AND tagID = "def";

    -- use the temp table somehow
    -- ...
    -- ...
    -- ...

    drop temporary table temp; -- otherwise it survives the stored proc call
END
$$ -- signify end of block
DELIMITER ; -- reset to default delimiter

Procedura memorizzata di prova

call uspK(); -- test it, no warnings on edge conditions

Cosa non fare

Uno non trova molta fortuna con quanto segue. Se la pensi così, eseguilo un paio di volte;

drop procedure if exists uspK;
DELIMITER $$
create procedure uspK ()
BEGIN
    -- drop temporary table if exists temp;

    create temporary table if not exists temp
    SELECT aID, bID
    FROM tags
    WHERE placeID = "abc" AND tagID = "def";

    -- use the temp table somehow
    -- ...
    -- ...
    -- ...

    -- drop temporary table temp; -- otherwise it survives the stored proc call
END
$$ -- signify end of block
DELIMITER ; -- reset to default delimiter

perché create temporary table if not exists temp è friabile

Commenti generali

Non si dovrebbe intraprendere la scrittura di processi memorizzati fino a quando non si è in qualche modo fluenti sul semplice argomento dei DELIMITERS. Ne ho parlato in una sezione qui chiamato Delimitatori . Sperando solo di evitare inutili perdite di tempo su una cosa così semplice, che può far perdere un sacco di tempo per il debug.

Inoltre, qui nella tua domanda, così come in quel riferimento, tieni presente che la creazione di tabelle è DDL che può hanno una grande percentuale della profilazione complessiva (prestazioni). Rallenta un processo rispetto all'utilizzo di una tabella preesistente. Si potrebbe pensare che la chiamata sia istantanea, ma non lo è. In quanto tale, per le prestazioni, l'utilizzo di una tabella preesistente con i risultati inseriti nel proprio ID riga segmentato è molto più veloce del sovraccarico DDL.