2015-12-24 1 views
3

J'ai une table avec des fournisseurs qui a la structure suivante:la restauration des données PHP dans le cas de la migration a échoué

enter image description here

attention au champ fournisseur. C'est un VARCHAR maintenant. Je dois supporter ce système à partir d'un autre développeur et maintenant nous devons avoir la liste des fournisseurs et stocker des informations supplémentaires, donc j'ai créé une autre table pour stocker les fournisseurs en réalité.

Il a la structure suivante: id, le nom, la marge, outer_name, etc.

Je prévois de changer le type de fournisseur à INT(32) et il pointera vers le tableau des fournisseurs.

Le problème est que MySQL ne supporte pas les transactions pour changer la structure de la base de données.

Si je change de type de champ de chaîne en entier, toutes les données précédentes sont perdues. SI quelque chose ne va pas au milieu. Je suis perdu.

Serait-il correct d'exporter des données vers un fichier en utilisant la sérialisation et de les lire à partir de là?

Y a-t-il de meilleures façons de le faire?

+1

méthode la plus sûre: mysqldump pour classer, éditer le fichier pour changer la définition du champ, sauvegarder pour séparer le fichier dump. charger le vidage modfied, et si quelque chose explose, vous avez la vidage d'origine comme solution de repli. –

+1

Pourriez-vous ajouter un champ supplémentaire, par exemple provider_id, qui fait référence à votre nouvelle structure de table, effectuer votre migration et exécuter les deux systèmes côte à côte. Une fois que vous êtes satisfait, il n'y a pas de problèmes (les entrées ont peut-être une valeur dans les deux champs?) Supprimez ou videz l'ancien champ 'provider'. – Graeme

+0

Graeme, ressemble à la solution la plus facile pour moi. Pas besoin de créer une nouvelle table. Probablement il serait nécessaire de créer une nouvelle table pour des situations plus complexes mais exactement dans ce cas je ne vois aucune nécessité. Si vous postez comme réponse, je l'accepterai – Tebe

Répondre

1

Veuillez suivre les étapes ci-dessous pour migrer les données vers une nouvelle table et modifier une colonne.

1. Insérez toutes les données dans nouvelle table (Provider Table)

INSERT INTO providerTable (NAME) 
SELECT DISTINCT provider 
FROM suppliers; 

2. Mise à jour ProviderId en principal (fournisseur) Table

UPDATE suppliers s 
INNER JOIN providerTable p ON s.provider = p.name 
SET s.provider = p.id; 

Avant de modifier la table s'il vous plaît vérifier vos données dans la table des fournisseurs.

3. Ensuite alter colonne type de données de Main (fournisseur) Table

ALTER TABLE suppliers CHANGE provider provider INT(4) NOT NULL 

En utilisant cette approche, vous n'avez pas besoin de prendre la sauvegarde de la table. Vous ne perdrez aucune donnée.