すべての列が varchar 型のテーブルがありますが、データは実際には数値です。つまり、decimal(6,2) の方が適切です。列が多い場合、すべての列を varchar から decimal に変更するにはどうすればよいですか。ご協力いただきありがとうございます。
2 に答える
を使用して、個々の列を10進数に変更できますALTER TABLE tablename MODIFY COLUMN columnname DECIMAL(6,2);
。数値に変換できる文字列はすべて変換され、その他の文字列はゼロに変更されます。
これを非破壊的に確実に実行したい場合は、代わりにALTER TABLE ADD COLUMN
10進列を追加してからUPDATE tablename SET decimalcolumn = textcolumn
、SELECTを使用して、textcolumn
とdecimalcolumn
が等しくない行をチェックすることができます(の一部として型変換を実行します)。比較なので、必要に応じて、"5"
と5.00
は等しくなります)。
同じ変換を一度に複数の列に自動的に適用する方法はわかりませんが、PHPまたは別のプログラミング言語では、テーブルから行を選択し、返される列をループして、MODIFYを実行することで実行できます。それぞれについて。列が数個しかない場合は、手作業で行う方がおそらく簡単です。
MySQL のALTER TABLE
ステートメントは、一度に複数の列を変更することをサポートしています。実際、1 つのステートメントでできるだけ多くの変更をテーブルのスキーマに行うことが推奨されます。ALTER TABLE
これは、MySQL がスキーマの変更を行うためにテーブル全体をコピーしますが、ステートメントごとに 1 回だけコピーを行うためです。これは、非常に大きなテーブルを変更するときの重要な時間の節約になります!
とはいえ、いくつかの方法で変更をリハーサルできます。
まず、本番データベースではなく、開発データベースを使用してこれらすべてをテストします。次に、 を使用CREATE TABLE ... LIKE ...
して構造的に同一のテーブルを作成し、 を使用INSERT INTO ... SELECT * FROM ...
してデータをコピーできます。これで、 を試すことができますALTER TABLE ... MODIFY COLUMN ... DECIMAL(6,2)
。ある列でこれを実行してメッセージが表示された0 Warnings
場合、その列は問題なく変換され、次の列をテストできます。警告が表示された場合は、多数の警告SHOW WARNINGS
が表示されるので、MySQL がどのような問題に遭遇したかがわかります。
データをどれだけよく知っているかに応じて、さまざまなSELECT
s を実行してデータを検索およびフィルタリングし、範囲外または変換できないデータ (たとえば、空白または数値ではなくテキスト) を確認することもできます。
はい、このアプローチには時間がかかりますが、これに満足したら、すべてのMODIFY COLUMN
句を 1 つのステートメントにまとめて、実際のテーブルで実行できます。