データベース内のすべての列名を一度に小文字に変換する単一の MYSQL スクリプトを探しています...
大文字と小文字が混在する列名 (奇妙な命名規則を持つ 150 個のテーブル) を持つ MYSQL データベースを継承しましたが、これを行うために各テーブルを手動で処理したくありません。
誰かがそのようなスクリプトを持っていますか?
ありがとう
完成したクエリの例として、他の誰かがこれを望んでいる場合は、使用する前にテストしてください。
必要に応じて完成したソリューションを編集する
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;
HTH将来誰か...ところでビューもここでスクリプト化されているので、最終的なSQLコードからそれらを取り除く必要があるかもしれません
mysqldump
次の正規表現を SQL ダンプ (たとえば、 によって生成されたダンプ)に適用することで、すべてのテーブルと列の名前を小文字に変更できます。
s/`\(\w\+\)`/\L&/g
これが機能するのは、すべてのテーブルと列の名前が `` (バッククォート) で囲まれているためです。データとは別に、スキーマのみでこれを行うことをお勧めします (テーブル構造のみを操作してから挿入を行います)。
Vim でこれを行うには、SQL ダンプを開き、次のコマンドを入力します。
:%s/`\(\w\+\)`/\L&/g
または、次を使用してコマンドラインから実行しますsed
。
sed 's/`\(\w\+\)`/\L&/g' input.sql > output.sql
繰り返し実行する必要がある場合は、式をテキスト ファイルに保存し、次のように呼び出します。
sed -f regex.txt input.sql > output.sql
lepe によって提案された解決策は、本当に唯一の安全な方法です。スクリプトによる方法は危険すぎて、簡単にエクスポートしたり、間違ったデータ定義を処理したりします。上記のサンプル スクリプトはすべて、いくつかのデータ型を省略しているため、不完全です。
テーブル名と列名の前後にバッククォートを配置する sqldump を実行し、Notepad++ を使用して (`.*`) を検索し、\L\1 に置き換えました。これにより、すべてのテーブルと列の名前が小文字になりました。
次に、データベースをバックアップし、すべてのテーブルを消去してから、.sql ファイルを実行して再構築しました。どのデータにもバックティック記号の出現が見つからなかったので、データとは別に構造を作成することについて心配しませんでした。
私の場合、私の開発環境ではデータ入力用のフィールド ラベルとして first_name が First Name: に自動的に変換されるため、列名はすべて小文字にする必要があります。それらを大文字のままにしておくと(継承した)、それらは私が望むものではないFIRST NAMEに変換され、すべてのフィールドラベルを変更する必要があります。
このタスクは、次のステートメントからの出力から始めて、スクリプトを作成することで解決できます。
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'dbname';
ORDER BY table_name
この機能の詳細については、「MYSQL ::THEINFORMATION_SCHEMACOLUMNSテーブル」を参照してください。
次に、ALTER TABLE .. CHANGE機能を使用して、列の名前を変更できます。
例えば
ALTER TABLE mytable CHANGE old_name new_name varchar(5);
「 MYSQL::ALTERTABLE構文」も参照してください。
データ型が異なれば要件も異なるため、UNIONが必要です。
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