Fractionnement d'une grande colonne d'un tableau en une autre table de colonnes plus petites MYSQL
-
13-12-2019 - |
Question
Je me suis arraché les cheveux en essayant de diviser une grande colonne d'un tableau (1,7 million de lignes) en 24 colonnes beaucoup plus petites dans un tableau différent.
Le tableau de est :"codes postaux" qui contient la colonne à diviser "code postal" et une colonne "id" à incrémentation automatique
& le tableau à est :"postcodes_spit" qui contient 24 colonnes appelées "postcoden" (insérer 1-24 dans n) ;-)
Je peux bien INSÉRER dans la première des 24 colonnes :
INSERT INTO postcodes_split (postcodes1)
SELECT postcode
FROM postcodes
WHERE (id <= 72974);
mais les INSERTS suivants ne commencent bien sûr pas à partir de la ligne 0 dans les autres colonnes.
J'ai essayé de faire UPDATE à la place mais j'ai une mauvaise syntaxe et je n'arrive pas à la corriger :
UPDATE postcodes_split
SET postcodes2 = postcode FROM postcodes
WHERE id FROM postcodes BETWEEN 72975 AND 145948
J'espère que quelqu'un pourra m'aider !
La solution
Voici une idée non testée que je ne suggérerais qu'une opération unique comme celle-ci:
UPDATE postcodes_split pcs, postcodes pc
SET pcs.postcodes2 = pc.postcode
WHERE pcs.id = pc.id - 72974
Autres conseils
S'il vous plaît, arrêtez-vous et reconsidérez ce que vous faites.Est-ce vraiment nécessaire ?Les données stockées dans un format large comme celui-ci sont le fléau des programmeurs SQL du monde entier.Ce n’est pas la bonne façon de procéder !
Cependant, en supposant que vous continuiez quand même :
Chaque INSERT
L'instruction crée une nouvelle ligne.La meilleure approche consiste donc à insérer les 24 colonnes à la fois en une seule commande.Faites quelque chose comme ceci :
INSERT INTO postcodes_split (postcodes1,postcodes2,postcodes3,...)
SELECT p1.postcode, p2.postcode, p3.postcode...
FROM postcodes p1 WHERE (id <= 72974)
join postcodes p2 on p2.id = p1.id + 72974
join postcodes p3 on p3.id = p1.id + 145948
...
Vos calculs exacts peuvent varier selon que l'identifiant est basé sur 0 ou sur 1.
Encore une fois, ne faites pas cela (mais je suppose que votre patron vous dit probablement de le faire ;dans ce cas, amusez-vous !).