我在SO上遇到了这个示例,它提供了一种通过忽略空值来创建唯一索引的解决方案。但是,我想扩展它,但我无法找到解决方案。
我有一个表的 3 列的复合索引(表中还有其他 10 列)。这些列不是 PK 的一部分。在这 3 列中,2 将始终保存一些值,第 3 列可能为 NULL。我有大量的测试数据,并且有很多插入,其中 2 列具有相同的值,第 3 列为 NULL。这些所有插入都适用于 PostgreSQL,但 Oracle 抱怨说。为了使我的测试用例正常工作,我认为最简单的解决方案是为 Oracle 尝试一个可以像在 PostgreSQL 中一样工作的唯一索引。
准确地说:我想要一个以下类型的构造,不知道如何组合col1 + col2 + col3
create unique index tbl_idx on tbl (nvl2(col3, col1 + col2, col1 + col2 + col3))
我正在使用 liquibase。索引以下列方式创建 -
<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 创建我的测试数据,这里有两个插入语句
<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 约束违规”。