web-dev-qa-db-ja.com

主キーをvarcharからintに変更する

userテーブルがあり、主キーとしてvarcharを使用しています。ここで、別の場所から、主キーのintvarcharより優れているというパフォーマンスのヒントを得ました。

そこで、主キーをintに変更します。そのために、別のuserテーブルを作成し、前の主キー値以外のデータをそのテーブルにコピーしました。

これまでは問題ありません。

今私の問題は、以前の主キーを介してuserテーブルに関連付けられている多くのテーブルがあることです。次に、他のテーブルの行を新しい主キー値に関連付けます。

これを行う方法?

3
user2302288

主キーを変更する場合は、別のテーブルを作成する必要はありません。

私が実行するステップは次のとおりです。

  1. 主キーになる新しい整数列を追加します。
  2. nique値を入力し、一意の制約があることを確認します。 (主キーになることができることを確認するには、一意である必要があります)
  3. 各子テーブルで、外部キーの整数列を追加します。
  4. 古い外部キーを検索して、新しい外部キーを設定します。

例えば.

 tblUser(
 oldID varchar(10)、
 newID int、-新しい列が追加されました。この時点で、列にデータが入力されていると想定しています
 ... 
)
 
 tblUserLogin(
 keyUser_oldID varchar(10)、
 keyNewID int NULL、
 ... 
)
 
以下を実行します...私は最近SQL Serverで主に作業しているので、うまくいけば、この疑似コードが正しい考えを与えるでしょう。原則は、主要なテーブルベースのデータベースシステムに適用されます。
 
 UPDATE tblUserLogin 
 SET keyNewID =(SELECT newID FROM tblUser WHERE oldID = keyUser_oldID 
  1. 2つのnew列の間に外部キーを追加します。
  2. 新しい主キーが自動インクリメントに設定されていることを確認してください。
  3. OldIDとkeyUser_oldIDがどこからも参照されなくなったら、それらの列を削除できます。 しかし、あなたが完全に確信した後でのみ!

考慮すべきいくつかのこと

これが一般的な原則であり、考慮すべき点がいくつかあります。

  • これは単純なケースで機能し、しばらくの間データベースを使用するユーザーを停止できること、およびこれらのテーブルを使用するすべてのコードを新しい列名を使用するように切り替える準備ができていることを前提としています。
  • サブクエリは最も効率的な方法ではありませんが、これは1回限りのタスクであり、数百万の行と切り替えを行うための限られた時間がない限り、問題ありません。
  • Varcharフィールドに何を格納しているのか言わなかったのですか?数値(ただしvarchar形式)の場合は、常にUPDATE tblSomeTable SET keyNewID = CAST(keyOldID as int)を実行できます。

最も重要なのは...

..データベースが重要なものに使用されているかどうかは言及しません。そうでない場合でも:

  • まだバックアップしていない場合は、事前にバックアップしてください。更新ステートメントに誤りがある場合は、いつでもバックアップコピーを参照できます。
  • 手順を考えてみてください。これらは構造的な変更です。計画に30分を費やすと、後で何時間も節約できます。
  • 何か問題が発生した場合に備えて、バックアップ計画を立ててください。
7
Greg Robson