[英]MySQL temporary tables do not clear
背景-我有一个由单个大平面文件创建的数据库。 而不是创建一个具有106列的大型表。 我创建了一个“列”表,该表存储列名和保存该数据的表的ID,以及106个其他表,用于存储每一列的数据。 由于并非所有记录的所有列都包含数据,因此我认为这可能是加载数据的更有效方法(可能是个坏主意)。
这样做的困难在于从该结构重建单个记录。 为方便起见,我创建了以下过程:
DROP PROCEDURE IF EXISTS `col_val`;
delimiter $$
CREATE PROCEDURE `col_val`(IN id INT)
BEGIN
DROP TEMPORARY TABLE IF EXISTS tmp_record;
CREATE TEMPORARY TABLE tmp_record (id INT(11), val varchar(100)) ENGINE=MEMORY;
SET @ctr = 1;
SET @valsql = '';
WHILE (@ctr < 107) DO
SET @valsql = CONCAT('INSERT INTO tmp_record SELECT ',@ctr,', value FROM col',@ctr,' WHERE recordID = ',@id,';');
PREPARE s1 FROM @valsql;
EXECUTE s1;
DEALLOCATE PREPARE s1;
SET @ctr = @ctr+1;
END WHILE;
END$$
DELIMITER ;
然后,我使用以下SQL,其中存储过程参数是我想要的记录的ID。
CALL col_val(10);
SELECT c.`name`, t.`val`
FROM `columns` c INNER JOIN tmp_record t ON c.ID = t.id
问题-我第一次运行此程序效果很好。 但是,即使更改了参数,每次后续运行都会返回完全相同的记录。 即使在存储过程应该删除并重新创建临时表的情况下,这种情况如何持续存在?
我可能会重新考虑整个设计,然后回到一张桌子,但是这个问题说明了我想了解的东西。
不确定是否重要,但是我正在Windows 7上运行MySQL 5.6(64位),并通过MySQL Workbench v5.2.47 CE执行SQL。
谢谢,
在MySQL存储过程中,请勿在局部变量(输入参数或局部声明的变量)前放置@
符号。 您使用的@id
引用了一个用户变量 ,类似于您从中调用过程的会话的全局变量。
换句话说, @id
是从一个不同的变量id
。
这就是您遇到的直接问题的解释。 但是,我不会像您那样设计表格。
由于并非所有记录的所有列都包含数据,因此我认为这可能是加载数据的更有效方法
我建议使用常规的单个表,并使用NULL表示丢失的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.