sql >> Base de Datos >  >> RDS >> Mysql

Insertar tabla temporal de MySQL

trabajando en lo que escribió Code-Monk, considere lo siguiente:

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

Procedimiento almacenado de prueba

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

Qué no hacer

Uno no encontrar mucha suerte con lo siguiente. Si crees que sí, ejecútalo unas cuantas veces;

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 es raro

Comentarios generales

Uno no debe embarcarse en escribir procesos almacenados hasta que tenga algo de fluidez en el tema simple de DELIMITADORES. Escribí sobre ellos en una sección aquí llamados Delimitadores . Solo con la esperanza de evitar una pérdida de tiempo innecesaria en algo tan simple, que puede desperdiciar mucho tiempo de depuración.

Además, aquí en su pregunta, así como en esa referencia, tenga en cuenta que la creación de tablas es DDL que puede tienen un gran porcentaje del perfil general (rendimiento). Ralentiza un proceso en comparación con el uso de una tabla preexistente. Uno podría pensar que la llamada es instantánea, pero no lo es. Como tal, para el rendimiento, usar una tabla preexistente con los resultados colocados en su propio ID de fila segmentado es mucho más rápido que soportar la sobrecarga de DDL.