web-dev-qa-db-fra.com

Quel est un bon moyen d'ajouter une clé primaire à une grande table InnoDb?

J'ai une table avec environ 30 millions de lignes dans MySQL 5.5 à l'aide du moteur de stockage Innodb. Cette table a une clé étrangère qui relie une autre table avec environ 3 millions de rangées.

Je veux ajouter une clé primaire à la table la plus grande, mais je ne suis pas sûr de la meilleure façon d'y aller. Il n'y a pas de colonne (ou de colonnes) existante que je peux utiliser pour cela, alors comment devrais-je y aller?

J'ai vu des références à un ID d'enregistrement INNODB interne, mais je n'ai pas trouvé si cela est accessible.

Sinon, peut-être que je devrai jeter et recharger les données, en ajoutant l'identifiant manuellement.

Merci.

8
Wodin

cela peut être la mauvaise façon d'y aller, mais ..

ne pouviez-vous pas simplement modifier la structure de la table,

ajouter une colonne de clé primaire à la table

ensuite...

écrivez un script rapide pour traverser toute la table

ajout d'une valeur d'autocramentage à la nouvelle colonne?

7
Patrick

Voici comment je voudrais aborder ceci:

  1. Créez une nouvelle table avec la structure souhaitée, y compris votre clé primaire avec auto_incrènement et probablement un autre champ indexé.
  2. Prenez un temps d'arrêt pour arrêter tout le trafic.
  3. Confirmez que vous avez une sauvegarde légitime de vos données.
  4. Copier toutes vos lignes de votre table existante dans la table cible tirant parti de l'incrément automatique pour créer vos identifiants. *par exemple. Insérer dans cible_table (col1, col2, etc.) Sélectionnez (COL1, COL2, etc.) de Origin_Table; *
  5. Testez que les données de la nouvelle table sont exactes.
  6. [~ # ~] renommer [~ # ~ # ~] l'ancienne table à origine_table_bak.
  7. [~ # ~] renommer [~ # ~ #] Target_table à Origin_Table.
  8. Test de fumée Votre application.
  9. Ouvert à la circulation.
  10. Après votre prochaine sauvegarde, Drop Origin_Table_bak.

* Remarque: Si la table d'origine est innodub, des contraintes de clé étrangère seront maintenues et survivent au renommage. Donc, vous devrez faire une modification pour remédier à cela.

3
randomx