MySql错误分配变量

时间:2017-06-15 18:55:37

标签: mysql dynamic-sql transactional sequelpro

我正在尝试编写一个脚本,该脚本将从大型父表创建较小的表。 (在这种情况下,我别无选择。)但是,已经有一段时间了,因为我不得不做任何严肃的SQL工作而且我被可能是愚蠢的事情所困扰......这不会超过第一对没有爆炸的线条。

DELIMITER $$
BEGIN
SET @I = 1; 
SET @CountCol = 'Item Number';
SET @StartPos = 0;
SET @EndPos = 24999;
SET @TotalCount = (SELECT Count(@CountCol) FROM `All_Info`);
SET @HowMany = CEILING(@TotalCount / 25000) + 1;

WHILE @I < @HowMany DO
    SET @query = CONCAT('CREATE TABLE All_Info_',@I,' AS (SELECT @n := @n + 1 `id`, * FROM All_Info LIMIT ',@StartPos,',',@EndPos,'),PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;)');
    PREPARE stmt from @query;
    EXECUTE stmt;

    SET @I = @I + 1;
    SET @StartPos = @EndPos;
    SET @EndPos = @EndPos + 25000;
END WHILE;
END$$

我得到的错误是:

  

[查询1中的错误]您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在第2行的“SET @I = 1”附近使用正确的语法

我觉得我正在服用疯狂的药片。我有什么想法吗?

(注意:使用Sequel Pro作为我的客户,如果有某种相关的话)

1 个答案:

答案 0 :(得分:0)

像往常一样,我的回答很明显:你不能在存储过程之外做一个WHILE循环。糟糕。

将此放入程序并调用它修复了我的困境。我还必须删除引擎和默认字符集。简化了一下。现在效果很好。

DROP PROCEDURE IF EXISTS TableSplitTemp;
DELIMITER ;;
create procedure TableSplitTemp ()
BEGIN
SET @I = 1;
SET @CountCol = 'Item Number';
SET @StartPos = 0;
SET @EndPos = 24999;
SET @TotalCount = (SELECT Count(@CountCol) FROM `All_Info`);
SET @HowMany = CEILING(@TotalCount / 25000) + 1;
WHILE @I < @HowMany DO
    SET @query = CONCAT('CREATE TABLE All_Info_',@I,' AS (SELECT * FROM All_Info LIMIT ',@StartPos,', ',@EndPos,');');
    PREPARE stmt from @query;
    EXECUTE stmt;

    SET @I = @I + 1;
    SET @StartPos = @EndPos;
    SET @EndPos = @EndPos + 25000;
END WHILE;
END;;
delimiter ;
/* call TableSplitTemp(); ta-daa it works! */