2011-07-20 5 views
0

と選択的に一意性インデックスの問題私は時間の任意の時点で、私は(ID、名前、タイプ)のためのis_deleted「N」を有する唯一つのエントリが欲しいの選択一意のインデックスオラクル:更新

CREATE UNIQUE INDEX fn_unique_idx 
    ON table1 (CASE WHEN is_deleted='N' THEN id ELSE null END, 
       CASE WHEN is_deleted='N' THEN name ELSE null END, 
       CASE WHEN is_deleted='N' THEN type ELSE null END); 

を作成しました。

挿入は正常に動作します。すなわち、is_deleted = 'N'で挿入しようとすると、複数のis_deleted 'Y'を入力することができます。

しかし、私はそれを更新しようと Oracleエラーをスローをされています

ORA-00600: internal error code, arguments: [qctVCO : bfc], [1], [0], [1], [871], [1], [2], [875], [], [], [], [] 


SQL : UPDATE table1 set is_deleted = 'Y' where id = 1, name = 'foo' and type =bar'; 

私が削除したとして、この現在のエントリを設定し、更新されたデータを使用して新しいエントリを挿入し、is_deleted =「N」にしたいです。これは基本的に歴史を維持するためです。

誰かがこの問題を解決するのに役立つことがありますか?

ありがとうございました。

答えて

1

エラーの種類がOracleの内部エラーです - バグ別名...

どのパッチバージョンは、あなたがオンになっていますか?ちょうどその時のために現在のものに行くかもしれない。

+0

OracleバージョンはOracle Database 11g Enterprise Editionリリース11.1.0.7.0 - 64ビット製品です –

+1

11.1のqctVCO:bfcの唯一のバグは7599848です。これは索引付きの暗号化列を持つ表からの選択に関連しています。 Windowsでは11.7.0.7のパッチ6で修正され、11.2.0.1では修正されました。TDEを使​​用している場合を除き、おそらく関連はありませんが、Randyのパッチに同意し、それがなくならない場合はOracleにSARを提出します。私はまだBrankoのアドバイスを見ます。 (そして、私はコマンドと欠落している見積もりが転写エラーであると仮定し、あなたの実際のSQLの更新は有効ですか?) –

1

私が達成しようとしていることを理解していれば、同じ(id, name, type)の複数の行を持つことができます。これらの行のいずれかについては、is_deleted = 'N'、残りの部分はis_deleted = 'Y'です。

これは間違いありませんか?

もしそうなら、私はいくつかのアイデアを提供してみましょう:

  1. is_deletedフィールドを削除します。代わりに、versionフィールドを持ち、最新バージョンが何であれ、これは削除されない行です。ユニーク制約/インデックスは当然(id, name, type, version)をカバーします。しかし、これはクエリを複雑にする可能性があります。
  2. 新しいフィールドを3つ導入する:archive_idarchive_namearchive_typeユニーク制約は依然として元の(id, name, type)をカバーします。この行は、値をarchive_*のフィールドに移動し、元のフィールドをNULLにすることによって「削除」されます。これは、すべてのNULLを含むタプルが(ユニークな)インデックスに含まれないために機能するはずです。
  3. ユニーク制約のないアーカイブデータ用の別のテーブルがあります。
  4. UNIQUE INDEXではなくCONSTRAINT UNIQUEを使用していますか?

また、再生に参照整合性の制約がある場合はお知らせください。

+0

別の素晴らしいトリックは、別のテーブル(is_deleted)を作成し、元のテーブルの主キー列、元のテーブルの主キーが2番目のテーブルに存在するときに元のテーブルの行が表示されないようにする、細かいセキュリティポリシーです。 (2番目の表のフラグを反転することで、視認性のあるゲームをプレイできます) – Randy

0

ブランコと同意するポイント#3。アーカイブデータの場合は、START &終了日をこの別のテーブルに追加することもできます。