2017-06-15 100 views
0

我想写一个脚本,将从一个大的父表创建较小的表。 (在这种情况下,我没有选择)。但是,这已经有一段时间了,因为我不得不做任何严肃的SQL工作,并且我被可能是愚蠢的东西所困惑......这不会超过第一对线没有炸毁。MySql错误分配变量

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 ERROR]您的SQL语法错误;检查对应于您的MySQL服务器版本的手册,在第2行'SET @I = 1'附近使用正确的语法。

我觉得我正在服用疯狂的药。任何想法我做错了什么?

(注:使用续集Pro作为我的客户,在以某种方式相关的情况下)

+0

你认为这是一个潜在的分号问题吗? – JoshKopen

+0

尽我所知,尽管这是错误停止的地方。我无法理解它。 – tobybot

回答

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! */