Y at-il un moyen d'ignorer les colonnes qui n'existent pas sur INSERT?
Je suis en utilisant un MySQL GUI à migrer certains sites pour une nouvelle version d'un CMS par la sélection de certains tableaux et de l'exécution de l' INSERT
déclaration généré à partir d'une sauvegarde dump dans un tableau vide (le nouveau schéma). Il y a quelques colonnes dans les anciennes tables qui n'existent pas dans le nouveau, de sorte que le script s'arrête avec une erreur comme ceci:
Ligne de Script: 1 Unknown column 'user_id' in 'field list'
Cherry-picking les colonnes souhaitées à l'exportation, ou d'éditer le fichier de vidage serait trop long et fastidieux. Pour contourner cela, je suis de la création de la inutilisés de colonnes que les erreurs sont générées, l'importation de ces données par l'exécution de la requête, puis à la baisse le solde non utilisé des colonnes quand j'en ai fini avec ce tableau. J'ai regardé INSERT IGNORE
mais cela semble être de ne pas tenir compte des doubles de clés (pas ce que je cherche).
Est-il de toute façon à la préforme un INSERT
tout en ignorant les colonnes qui n'existent pas dans la table cible? Je suis à la recherche de quelque chose de "indolore", comme certaines des fonctionnalités SQL.
De préciser, je suis en train de travailler avec un tas de fichiers de sauvegarde et importation des données dans une base de données locale pour les tests avant de le déplacer sur le serveur live. Exemple du genre de solution, je suis en espérant:
-- Don't try to insert data from columns that don't exist in "new_table"
INSERT INTO `new_table` {IGNORE UNKNOWN COLUMNS} (`id`, `col1`, `col2`) VALUES
(1, '', ''),
(2, '', '');
Si quelque chose comme cela n'existe tout simplement pas, je suis heureux d'accepter que comme une réponse et continuer à utiliser ma solution actuelle.
source d'informationauteur Wesley Murch
Vous devez vous connecter pour publier un commentaire.
Votre technique actuelle semble assez pratiques. Juste une petite modification.
Plutôt que d'attendre d'erreur, puis en créant des colonnes, un par un, vous pouvez exporter le schéma, faire un diff et de trouver toutes les colonnes manquantes dans tous les tableaux.
De cette façon, il serait de moins en moins de travail.
De votre interface sera capable d'exporter juste schéma ou le commutateur suivant sur mysqldump sera utile pour trouver toutes les colonnes manquantes.
De comparaison la dbdump1.sql et dbdump2.sql qui va vous donner toutes les différences dans les deux bases de données.
vous pouvez écrire un magasin de fonction comme ça:
chaîne de retour contatining le dépôt de la liste comme ceci:
'champ_1,field_2,field_3,...'
puis créer un magasin de procédure
qui s'exécute trugh les tables et pour chaque table reçoit le dépôt des listes, puis crée une chaîne de caractères comme
puis exécution de la chaîne pour chaque table
Non, il n'y a pas de "indolore" façon de faire.
Au lieu de cela, vous devez traiter explicitement les colonnes qui n'existent pas dans les tables finales. Par exemple, vous devez les supprimer à partir du flux d'entrée, de les déposer après le fait, jouer de sales tours (
moteur=BLACKHOLE
+ déclencheurs d'INSÉRER seulement ce que vous voulez de la vraie cible du schéma), que ce soit.Maintenant, cela ne veut pas nécessairement besoin d'être manuel -- il existe des outils (comme Devart noté) et des moyens pour interroger la db catalogue pour déterminer les noms de colonne. Cependant, il n'est pas aussi facile que de simplement l'annotation des instructions INSERT.
Peut-être le CMS fournisseur peut fournir un bien raisonnable script de migration?
dbForge Studio for MySQL vous donnera l'occasion de comparer et synchroniser de données entre deux bases de données.
Par défaut, la comparaison des données est effectuée uniquement pour les objets avec le même nom; vous pouvez utiliser le mappage automatique ou carte objets de base de données manuellement. dbForge Studio vous permet de personnaliser le mappage de tables et de colonnes, de sorte que vous pouvez comparer les données des objets avec des non-égalité de noms, propriétaires, et de la structure. Vous pouvez également mapper les colonnes avec différents types, ce qui peut entraîner de la troncature des données, l'arrondissement, et les erreurs lors de la synchronisation pour certains types.
J'ai attentivement lu tous ces messages car j'ai le même défi. Veuillez consulter ma solution:
Je l'ai fait en c#, mais vous pouvez le faire n'importe quelle langue.
Vérifier l'instruction insert pour columnnames. Si l'un est absent de votre table de les AJOUTER à une colonne de TEXTE coz TEXTE peut manger n'importe quoi.
Lorsque vous avez terminé l'insertion dans la table, supprimer les colonnes ajoutées.
Fait.
trouvé votre question intéressante.
Je savais qu'il y avait un moyen de sélectionner les noms de colonne d'une table dans MySQL; c'est
show columns from tablename
. Ce que j'avais oublié c'est que tous les tables MySQL les données sont conservées dans une base de données spéciale, appelée "information_schema".C'est la solution logique, mais il ne fonctionne pas:
Je vais continuer à chercher, si. Si il est possible de saisir une valeur délimitée par des virgules de la
select column_name
requête, vous pouvez être dans les affaires.Edit:
Vous pouvez utiliser le
select ... from ... into
commande pour générer une ligne de CSV, comme suit:Je ne sais pas comment profiter de cette sortie à la base de la CLI stdout.