繁体   English   中英

MySQL临时表不清除

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM