1

同様の質問が寄せられていますが、過去に使用して問題が発生しました

ALTER TABLE tablename MODIFY columnname SMALLINT

サーバーがクラッシュし、前回これを実行したときにテーブルを回復する必要がありました。テーブルにそれほど多くのデータがある場合、このコマンドを使用しても安全ですか? テーブルで並行して実行されている可能性のある他のクエリがある場合はどうなりますか? テーブルをコピーして、新しいテーブルでクエリを実行する必要がありますか? 列をコピーして、データを新しい列に移動する必要がありますか?

これを行う際のベストプラクティスまたは「最も安全な」プラクティスがあれば教えてください。

また、これは多くの要因に依存することはわかっていますが、550 万行以下の InnoDB テーブルでクエリにかかる時間 (概算) を知っている人はいますか? 問題の列は TINYINT で、データが含まれています。より大きな値を処理するために SMALLINT にアップグレードしたいと考えています。

ありがとう!

4

4 に答える 4

0

新しい SMALLINT 列をテーブルに追加できます。

ALTER TABLE tablename ADD columnname_new SMALLINT AFTER columnname;

次に、データを古い列から新しい列にコピーします。

UPDATE tablename SET columnname_new = columnname WHERE columnname_new IS NULL LIMIT 100000

すべての記録が完了するまで上記を繰り返します

その後、古い列を削除できます:

ALTER TABLE tablename DROP COLUMN columnname

最後に、新しい列の名前を変更します。

ALTER TABLE tablename CHANGE columnname_new columnname SMALLINT

問題がないことを確認するために、100000行のバッチで古い列から新しい列への値のコピーを行うことができます

于 2016-09-13T14:38:05.203 に答える
0

新しい列を追加し、新しい列に値が存在するかどうかを確認し、存在する場合は読み取り/書き込みを行うようにコードを変更します。また、古い列から読み取り、新しい列に書き込むようにコードを変更します。この時点で、古い列の値を、新しい列に値が存在しない新しい列にコピーして、自由にデータを移行できます。

すべてのデータが移行されたら、古い列を削除できます。

于 2016-09-13T14:58:13.523 に答える