nullを無視して一意のインデックスを作成するソリューションを提供するSOのこの例に出くわしました。ただし、それを拡張したいのですが、解決策に到達できません。
テーブルの 3 つの列に複合インデックスがあります (テーブルには他に 10 列あります)。これらの列は PK の一部ではありません。これらの 3 つの列のうち、2 つは常に何らかの値を保持し、3 番目は NULL の場合があります。膨大なテスト データがあり、2 つの列が同じ値で 3 番目の列が NULL の挿入が多数あります。これらのすべての挿入は PostgreSQL ではうまく機能しますが、Oracle は文句を言います。私のテストケースが機能するための最も簡単な解決策は、PostgreSQL で機能するのと同じように機能する Oracle の一意のインデックスを試すことだと思います。
正確には: 次の種類の構成が必要ですが、結合方法がわかりませんcol1 + col2 + col3
create unique index tbl_idx on tbl (nvl2(col3, col1 + col2, col1 + col2 + col3))
リキベースを使用しています。インデックスは次の方法で作成されます -
<changeSet dbms="postgresql,oracle" author="abc" id="222">
<createIndex indexName="Index_7" schemaName="ss" tableName="Users" unique="true">
<column name="idOrganization"/>
<column name="strUsername"/>
<column name="strNotDeleted"/>
</createIndex>
</changeSet>
テストデータを作成するためにliquibaseを使用しています。ここに2つの挿入ステートメントがあります
<insert schemaName="ss" tableName="Users">
<column name="strUsername" value="user1" />
<column name="idUser" valueNumeric="20741" />
<column name="idOrganization" valueNumeric="4" />
<column name="strFirstName" value="user" />
<column name="strLastName" value="one" />
<column name="strEmail" value="email@foo.com" />
<column name="strNotDeleted" />
</insert>
<insert schemaName="ss" tableName="Users">
<column name="strUsername" value="user1" />
<column name="idUser" valueNumeric="20771" />
<column name="idOrganization" valueNumeric="4" />
<column name="strFirstName" value="user" />
<column name="strLastName" value="one" />
<column name="strEmail" value="email@foo.com" />
<column name="strNotDeleted" />
</insert>
これら 2 つの挿入は PostgreSQL では正常に機能しますが、Oracle では「Index_7 制約違反」というエラーで失敗します。