Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Inserir tabela temporária do MySQL


trabalhando no que Code-Monk escreveu, considere o seguinte:
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

Procedimento armazenado de teste

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

O que não fazer


Um não encontrar muita sorte com o seguinte. Se você acha que sim, execute-o algumas vezes;
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

porque create temporary table if not exists temp é esquisito

Comentários gerais


Não se deve embarcar em escrever procs armazenados até ser um pouco fluente no tópico simples de DELIMITERS. Escreveu sobre eles em uma seção aqui chamados Delimitadores . Apenas esperando afastá-lo do desperdício desnecessário de tempo em uma coisa tão simples, que pode desperdiçar muito tempo de depuração.

Além disso, aqui na sua pergunta, bem como nessa referência, tenha em mente que a criação de tabelas é DDL que pode têm uma grande porcentagem do perfil geral (desempenho). Ele desacelera um proc versus usar uma tabela pré-existente. Pode-se pensar que a chamada é instantânea, mas não é. Como tal, para desempenho, usar uma tabela pré-existente com os resultados colocados em seu próprio rowId segmentado é muito mais rápido do que suportar a sobrecarga de DDL.