我在SO上遇到此示例,它提供了一种通过忽略空值来创建唯一索引的解决方案。但是,我想扩展它,但我无法达成解决方案。Oracle:创建唯一索引,但忽略空值
我有一个表的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语句
<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 protected]" />
<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 protected]" />
<column name="strNotDeleted" />
</insert>
这2个刀片做工精细PostgreSQL的,甲骨文有错误但失败“违反Index_7约束”。
我不确定我是否理解您正在尝试解决的问题。如果创建了最简单的可能唯一约束,“alter table table_name add constraint uk_table_name unique(col1,col2,col3)',那么您想要排除哪些行以及/或者哪些行包含了您想要禁止? – 2012-08-09 22:53:53
@JustinCave:更新了我的问题,希望它能提供更好的图片。 – devang 2012-08-09 23:05:46
“甲骨文抱怨”究竟意味着什么?是否有错误讯息?如果是这样,有什么错误? 'col1,col2,col3'上的一个简单的复合唯一索引将允许您插入无限数量的行,其中'col1'和'col2'完全相同,'col3 IS NULL'。这听起来像你说这就是你想要的,这不是你观察到的,所以它会帮助发布一个小的测试用例,显示你想要达到的目标以及你得到的错误。 – 2012-08-09 23:13:48