大きなInnoDBテーブルにPRIMARY KEYを追加する良い方法は何ですか?


8

MySQL 5.5でInnoDBストレージエンジンを使用して約3,000万行のテーブルがあります。このテーブルには、約300万行の別のテーブルにリンクする外部キーがあります。

より大きなテーブルに主キーを追加したいのですが、これをどのように行うのが最善かわかりません。これに使用できる既存の列(または列のセット)がないので、どうすればよいですか?

内部InnoDBレコードIDへの参照をいくつか見ましたが、これがアクセス可能かどうかはわかりません。

それ以外の場合は、おそらくデータをダンプしてリロードし、IDを手動で追加する必要があります。

ありがとう。


それらはテーブル内のキーの組み合わせが自然にユニークなものですか?もしそうなら、複数列の主キーが意味をなすかもしれません。
ジャスティンDearing

残念ながら、そのような複合キーはあり得ませんでした。そうでなければ私はそれが理にかなっていることに同意します。これが不可能であることを明確にするために、投稿を編集しました。
Wodin

回答:


7

これはそれを回避するための間違った方法かもしれませんが、

テーブルの構造を変更するだけでは、

テーブルに主キー列を追加する

その後...

テーブル全体を確認する簡単なスクリプトを書く

新しい列に自動インクリメント値を追加しますか?


2
提案をありがとう。列を非主キーとして追加し、その後主キーに変換する必要があると思いますが、実際には、小さなテーブルでのテスト中に偶然にAUTO_INCREMENT列を(主キーとして)追加していることがわかりました。 IDを自動的に入力します。それは私にエラーを与えるだけだと思っていたので、それが答えだと思います。
Wodin、2011

データベースの使用率が高い場合は、重要ではないテーブルでこれをテストして、長期間ロックされないことを確認することができます
Patrick

@パトリック、注意のメモをありがとう。データベースは現在使用されていません。これにより、テーブルが長期間ロックされることが予想されます。
Wodin、2011

1
私はALTER TABLE blah ADD id INT NOT NULL AUTO_INCREMENT PRIMARY KEY;それをしました、そしてそれは2時間18分かかりました:)その間、私はテーブルへの書き込みを試みませんでしたが、読み取りはうまくいきました。
Wodin、2011

1
@Wodinすごい、それはalter tableコマンドのための長い時間です。うまくいきました。
Patrick

3

これが私がこれに取り組む方法です:

  1. PRIMARY KEY w / AUTO_INCREMENTおよびおそらく他の1つのインデックス付きフィールドを含む、目的の構造を持つ新しいテーブル作成します
  2. ダウンタイムを取り、すべてのトラフィックを停止します。
  3. データの正当なバックアップがあることを確認します。
  4. AUTO INCREMENTを利用して既存のテーブルからすべての行をターゲットテーブルにコピーし、IDを作成します。*例:INSERT INTO target_table(col1、col2、etc)SELECT(col1、col2、etc)FROM origin_table; *
  5. 新しいテーブルのデータが正確であることをテストします。
  6. RENAME origin_table_BAKに古いテーブルを。
  7. target_tableをorigin_tableにRENAMEします。
  8. アプリケーションをスモークテストします。
  9. トラフィックに戻って開きます。
  10. 次のバックアップの後で、origin_table_BAKをドロップします。

*注意:オリジンテーブルがInnoDBの場合、外部キー制約は維持され、名前の変更後も存続します。だから、それを改善するために変更をしなければならないでしょう。


3
ライブで実行する必要がある場合は、1つのRENAMEで手順6と7を実行して、アトミックにします。RENAME TABLE real_name TO old、new TO real_name;
リックジェームス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.