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 的字段名称没有歧义;它会导致很难诊断问题。
我正在尝试在子查询(存储过程)中使用临时 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 的字段名称没有歧义;它会导致很难诊断问题。