0

私はオラクルにたくさんのテーブルを持っていますが、どれも主キーを持っていません。

さらに、アプリケーションはオフライン モデルでクライアント サーバーにデプロイされています。

ここで、既存のレコードを変更せずにテーブルを更新するパッチを作成できるかどうか疑問に思います。

1)各テーブルに主キーを追加します(のようにid)。

2) この主キーの自動増加を行います。

3) テーブルを更新して主キー列を埋めます。

上記のジョブを実行するバッチ スクリプトを作成し、それをクライアントに送信して更新できるかどうか疑問に思っています。

4

1 に答える 1

1

列を作成し、それを主キーにする前に一意の値を入力する必要があります。この回答は、sequenceでそれを行う方法を示しています。これは、Oracle で値を自動インクリメントする方法です。

  1. 主キーとなる列を追加します (まだ主キーには設定できません)。この例では、列を として定義していますNUMBER(12)。これは、一連の自然数とともに、10^12 - 1 個の可能なキー値を提供します。多かれ少なかれ必要になると思われる場合は、それに応じて列のサイズを調整してください。

    ALTER TABLE myTable ADD myTableID NUMBER(12);
    
  2. SEQUENCE一意の値を生成するために使用されるOracle を作成します。私は通常Seq、値を生成するテーブルの名前に追加して、シーケンスに名前を付けます。好きな名前を付けてください。このシーケンスは値 1 ( START WITH 1) から始まります。インクリメントが定義されていないため、1 ずつインクリメントされます。

    CREATE SEQUENCE myTableSeq START WITH 1;
    
  3. シーケンスからの値で新しい列を更新します。これにより、すべての行に一意の値が割り当てられます。

    UPDATE myTable SET myTableID = myTableSeq.NEXTVAL;
    
  4. 列に値が設定されたので、主キーとして指定できます (手順 3 の前に、すべての値が null で一意ではないため、主キーとして指定することはできませんでした)。

    ALTER TABLE myTable ADD PRIMARY KEY (myTableID);
    
  5. 手順 1 ~ 4 では、既存の行を処理します。今後の行のキー値を自動的に設定するトリガーを追加します。

    CREATE OR REPLACE TRIGGER myTablePKSet
    BEFORE INSERT ON myTable
    FOR EACH ROW
    BEGIN
      :NEW.myTableID := myTableSeq.NEXTVAL;
    END;
    /
    

上に示したすべてのコマンドを (順番に) スクリプトに入れると、myTableテーブルの修正が得られます。残りのテーブルについて、必要に応じて繰り返します。

そして将来的には、最初から主キーを実装します。テーブルが主キーを持たないことは非常にまれであり、テーブルが主キーを必要としない場合を知ることは非常に高度なスキルです。最も安全な方法は、常に主キーを持つことです。

于 2013-05-28T02:32:22.473 に答える