7

データベース内のすべての列名を一度に小文字に変換する単一の MYSQL スクリプトを探しています...

大文字と小文字が混在する列名 (奇妙な命名規則を持つ 150 個のテーブル) を持つ MYSQL データベースを継承しましたが、これを行うために各テーブルを手動で処理したくありません。

誰かがそのようなスクリプトを持っていますか?

ありがとう

4

4 に答える 4

6

完成したクエリの例として、他の誰かがこれを望んでいる場合は、使用する前にテストしてください。

必要に応じて完成したソリューションを編集する

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コードからそれらを取り除く必要があるかもしれません

于 2009-10-23T13:05:55.977 に答える
6

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
于 2011-03-01T02:16:56.793 に答える
3

lepe によって提案された解決策は、本当に唯一の安全な方法です。スクリプトによる方法は危険すぎて、簡単にエクスポートしたり、間違ったデータ定義を処理したりします。上記のサンプル スクリプトはすべて、いくつかのデータ型を省略しているため、不完全です。

テーブル名と列名の前後にバッククォートを配置する sqldump を実行し、Notepad++ を使用して (`.*`) を検索し、\L\1 に置き換えました。これにより、すべてのテーブルと列の名前が小文字になりました。

次に、データベースをバックアップし、すべてのテーブルを消去してから、.sql ファイルを実行して再構築しました。どのデータにもバックティック記号の出現が見つからなかったので、データとは別に構造を作成することについて心配しませんでした。

私の場合、私の開発環境ではデータ入力用のフィールド ラベルとして first_name が First Name: に自動的に変換されるため、列名はすべて小文字にする必要があります。それらを大文字のままにしておくと(継承した)、それらは私が望むものではないFIRST NAMEに変換され、すべてのフィールドラベルを変更する必要があります。

于 2012-11-02T04:05:11.407 に答える
2

このタスクは、次のステートメントからの出力から始めて、スクリプトを作成することで解決できます。

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
于 2009-10-23T11:28:54.220 に答える