mysql 临时 table 在子查询中

mysql temporary table in subquery

我正在尝试在子查询(存储过程)中使用临时 table,但它 returns 为空结果集...

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_profile_with_templates`(IN _username NVARCHAR(50), IN _template NVARCHAR(50))
BEGIN
    SELECT id INTO @template FROM profile_template WHERE name=_template LIMIT 1;
    SELECT * FROM profile WHERE username=_username AND template=@template LIMIT 1;
    CREATE TEMPORARY TABLE IF NOT EXISTS sections SELECT * FROM profile_template_section WHERE template=@template;
    **CREATE TEMPORARY TABLE IF NOT EXISTS components SELECT * FROM component_template WHERE section IN (SELECT id FROM sections);**
    SELECT * FROM sections;
    SELECT * FROM components;
    SELECT * FROM component_template_option WHERE component_template IN (SELECT id FROM components);
END

**之间的查询是 returns 空... 如果我 运行 对真实 table 的相同查询,它 returns 值...

CREATE DEFINER=`root`@`localhost` PROCEDURE `get_profile_with_templates`(IN _username NVARCHAR(50), IN _template NVARCHAR(50))
BEGIN
    DROP TEMPORARY TABLE IF EXISTS sections;
    DROP TEMPORARY TABLE IF EXISTS components;
    SELECT id INTO @template FROM profile_template WHERE name=_template LIMIT 1;
    SELECT * FROM profile WHERE username=_username AND template=@template LIMIT 1;
    CREATE TEMPORARY TABLE IF NOT EXISTS sections SELECT * FROM profile_template_section WHERE template=@template;
    CREATE TEMPORARY TABLE IF NOT EXISTS components SELECT * FROM component_template WHERE section IN (SELECT id FROM sections);
    SELECT * FROM sections;
    SELECT * FROM components;
    SELECT * FROM component_template_option WHERE component_template IN (SELECT id FROM components);
    DROP TEMPORARY TABLE IF EXISTS sections;
    DROP TEMPORARY TABLE IF EXISTS components;
END

使用 CREATE ... SELECT 语句时,SELECT 部分将不会填充 table(如果它已经存在)。

如果在存储过程中创建不会在过程外部使用的临时 tables,最好在过程的开始和结束处使用 DROP TEMPORARY TABLE IF EXISTS 语句。结束的是程序自行清理;开始的那些确保从以前的执行中遗留下来的临时 table(即 errored/failed 在删除它们之前)不会干扰当前的执行。 您也可以将过程的主体包裹在 TRY 中,并将丢弃放在 TRY 之外,以确保丢弃发生,但这有点更高级。

使用 session/user/@ 变量时,请记住它们对于数据库连接是全局的,并且可以传递值;尽可能使用本地声明的变量(其范围不超出过程)。 奖励:另外,尽量确保此类变量的名称和过程参数与过程中使用的 table 的字段名称没有歧义;它会导致很难诊断问题。