2017-06-15 3 views
0

J'essaye d'écrire un script qui créera des tables plus petites à partir d'une grande table parente. (Je n'ai pas le choix dans ce cas.) Cependant, ça fait longtemps que je n'ai pas eu de travail SQL sérieux et je suis perplexe devant ce qui est probablement quelque chose de stupide ... Cela ne passera pas le premier couple des lignes sans exploser.Erreur MySql assignant des variables

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$$ 

L'erreur que je reçois est:

[Erreur dans la requête 1] Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser à proximité « SET @I = 1 » à la ligne 2

Je me sens comme si je prends des pilules folles. Des idées de ce que je fais mal?

(Remarque: L'utilisation Sequel Pro comme mon client, dans le cas qui est en quelque sorte pertinent)

+0

Pensez-vous qu'il s'agit d'un problème potentiel? – JoshKopen

+0

Pas aussi loin que je peux dire, même si c'est là que l'erreur s'arrête. Je ne peux pas comprendre cela. – tobybot

Répondre

0

Ma réponse, comme d'habitude, était quelque chose d'évident: vous ne pouvez pas faire une boucle à l'extérieur d'une procédure stockée . Oups.

En plaçant cela dans une procédure et en l'appelant fixe mes malheurs. J'ai également dû supprimer le moteur et le jeu de caractères par défaut. Simplifié un peu. Fonctionne bien maintenant.

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