2009-06-21 14 views
2

ユニーク制約を適用するOracleデータベース表があります。問題は、そのテーブルの列がnullの場合にのみ制約を適用したいということです。where句を使用したOracleのユニーク制約

ieです。行にdeleted_date列がない場合は、制約を適用し、それ以外の場合は無視します。これにより、レコードをソフトに削除し、レコードに対する制約を無視することができます。

これを行う方法についてのご意見はありますか?あなたがユニークになりたい列プラス削除日 -

乾杯、 マーク

答えて

6

ちょうどマルチカラム制約を作成します。削除されていない行はすべて一意の値を持ち、削除日はNULLになります。すべての削除された行は、削除日のために一意になります(タイムスタンプとみなされ、すべての削除を分割するのに十分な解像度です)。削除された行を削除日で区切ることができない場合は、新しい列を作成し、それを制約に追加して削除日を一意にすることも考えられますが、これは非常に控えめな解決策になります。

+0

男、私はこれを考えるのをやめようとしていました!ありがとう、それは私が思うだけうまくいくでしょう – Mark

4

解像度が十分でない場合は、固有の関数ベースのインデックスを作成できます。

例:

SQL> create table t (id,col,deleted_date) 
    2 as 
    3 select 1, 99, null from dual union all 
    4 select 2, 99, date '2009-06-22' from dual 
    5/

Tabel is aangemaakt. 

SQL> alter table t add constraint t_pk primary key (id) 
    2/

Tabel is gewijzigd. 

SQL> alter table t add constraint t_uk1 unique (col,deleted_date) 
    2/

Tabel is gewijzigd. 

これはダニエルによって記述溶液です。その場合

SQL> insert into t values (3, 99, date '2009-06-22') 
    2/
insert into t values (3, 99, date '2009-06-22') 
* 
FOUT in regel 1: 
.ORA-00001: unique constraint (RWK.T_UK1) violated 

がベースのユニークな機能を使用します(私はここでの唯一の日付の部分を使用しています)2つの行が正確に同じ時間で削除される可能性が今まであった場合、この解決策は十分ではありませんインデックス:

SQL> alter table t drop constraint t_uk1 
    2/

Tabel is gewijzigd. 

SQL> create unique index i1 on t (nvl2(deleted_date,null,col)) 
    2/

Index is aangemaakt. 

SQL> insert into t values (3, 99, date '2009-06-22') 
    2/

1 rij is aangemaakt. 

よろしく、 ロブ。

+0

+1:ユニークな関数ベースのインデックスはおそらく現在受け入れられている答えより優れています –

関連する問題