7
votes

un script mysql pour convertir les noms de colonne en minuscules

Je cherche un seul script MySQL pour convertir tous les noms de colonne dans une base de données en minuscule en une ...

J'ai hérité d'une base de données MySQL qui possède de nombreux noms de colonne de cas mixtes (150 tables avec une étrange convention de dénomination) et je ne veux pas passer à travers chaque table par table pour le faire.

Quelqu'un a-t-il un tel script?

merci


0 commentaires

4 Réponses :


2
votes

Vous pouvez résoudre cette tâche en construisant un script, en commençant par la sortie de cette instruction:

SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||'('||CHAR(character_maximum_length)||');' AS Line
    FROM information_schema.columns
    WHERE table_schema = dbname and datatype in ( 'CHAR', 'VARCHAR' )
    ORDER BY table_name
    UNION
SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||'('||CHAR(numeric_precision)||');' AS Line
    FROM information_schema.columns
    WHERE table_schema = dbname and datatype in ( 'INTEGER' )
    ORDER BY table_name
    UNION
SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||'('||CHAR(numeric_precision)||','||CHAR(numeric_scale)|');' AS Line
    FROM information_schema.columns
    WHERE table_schema = dbname and datatype in ( 'FLOAT' )
    ORDER BY table_name
    UNION
SELECT 'ALTER TABLE '||table_name||' CHANGE '|| column_name||' '||lower(column_name)||' '||datatype||');' AS Line
    FROM information_schema.columns
    WHERE table_schema = dbname and datatype in ( 'DATE' )
    ORDER BY table_name


2 commentaires

Je n'ai pas pu le tester mais je suis content d'être proche :)


Nous obtiendrons cette erreur "Erreur 1054 (42S22): colonne inconnue" DataType "dans" Liste de champ "" dans MySQL 5.7. Utilisez 'data_type', mais pas de "DataType"



6
votes

Si quelqu'un d'autre veut que cela ci-dessous est un exemple de la requête complétée, veuillez tester avant d'utiliser .....

Modifier la solution terminée comme demandé forte> p>

SELECT CONCAT(
'ALTER TABLE ', table_name, 
' CHANGE ', column_name, ' ', 
LOWER(column_name), ' ', column_type, ' ', extra,
CASE WHEN IS_NULLABLE = 'YES' THEN  ' NULL' ELSE ' NOT NULL' END, ';') AS line
FROM information_schema.columns
WHERE table_schema = '<DBNAME>' 
AND data_type IN ('char', 'varchar','INT', 'TINYINT', 'datetime','text','double','decimal')
ORDER BY line;


3 commentaires

Si vous avez une solution complète, vous devez probablement l'ajouter à votre question afin que d'autres puissent le trouver plus facilement


Voilà, ce n'est pas assez parfait mais assez proche!


Down Down électeur, vous demandez pourquoi vous avez voté. Tous les commentaires sont les bienvenus, merci



6
votes

Vous pouvez renommer tous les noms de table et de colonne à minuscules en appliquant l'expression régulière suivante à un vidage SQL (par exemple, le desmpurés générés par mysqldump ): xxx < p> Cela fonctionne car tous les noms de table et de colonne sont enveloppés par `` (backticks). Il est préférable de le faire sur le schéma uniquement, séparé des données (fonctionner avec des structures de table uniquement, puis effectuez les insertions).

Pour ce faire dans VIM, ouvrez le vidage SQL et entrez la commande suivante : xxx

ou le faire à partir de la ligne de commande à l'aide de sed : xxx

si vous Besoin de le faire à plusieurs reprises, stockez l'expression dans un fichier texte et l'invoquer comme suit: xxx


2 commentaires

Cela m'a beaucoup aidé. Merci!


Merci D3Vid pour l'édition. C'est beaucoup utile maintenant.



3
votes

La solution proposée par Lepe est vraiment le seul moyen sûr d'aller. Les méthodes de script sont trop dangereuses, faciles à exporter ou à traiter la mauvaise définition de données. Tous les examens d'exemple ci-dessus laissent plusieurs types de données, de sorte qu'ils sont incomplets.

J'ai fait un SqLDump qui place des backticules autour de la table et des noms de colonne, puis utilisé Notepad ++ pour rechercher (`. *`) et remplacer par \ l \ 1. Cela a rendu tous mes noms de table et de colonne à minuscules.

Puis j'ai sauvegardé ma base de données, a essuyé toutes les tables, puis exécuté mon fichier .sql pour reconstruire. Je ne m'inquiétais pas de faire une structure distincte des données car je n'ai trouvé aucune occurrence du symbole de backtock dans aucune de mes données.

Dans mon cas, j'ai besoin de mes noms de colonnes toutes les minuscules, car mon environnement de développement convertit automatiquement le nom de famille en prénom: comme mon étiquette de champ pour la saisie de données. Si je les ai laissés sous forme de casquettes (que j'ai héritée), ils se convertiraient au prénom qui n'est pas ce que je veux, je devrais modifier toutes mes étiquettes de champ.


0 commentaires