sql - Oracle:基于函数的索引选择性唯一性

标签 sql oracle indexing

我必须维护历史,所以我使用 is_deleted 列,它可以有“Y”或“N”。但是对于 is_deleted 'N' 的任何实例,我应该有 (a,b,c) 复合列的 uniwue 条目。

当我尝试创建基于函数的唯一索引时,出现错误。

CREATE UNIQUE INDEX fn_unique_idx ON table1  (CASE WHEN is_deleted='N' then (id, name, type) end);

第 1 行的错误:
ORA-00907: 缺少右括号

请帮忙。

谢谢

最佳答案

你需要类似的东西

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);

约束条件的一个例子
SQL> create table table1 (
  2    id number,
  3    name varchar2(10),
  4    type varchar2(10),
  5    is_deleted varchar2(1)
  6  );

Table created.

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

Index created.

SQL> insert into table1 values( 1, 'Foo', 'Bar', 'N' );

1 row created.

SQL> insert into table1 values( 1, 'Foo', 'Bar', 'Y' );

1 row created.

SQL> insert into table1 values( 1, 'Foo', 'Bar', 'Y' );

1 row created.

SQL> insert into table1 values( 1, 'Foo', 'Bar', 'N' );
insert into table1 values( 1, 'Foo', 'Bar', 'N' )
*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.FN_UNIQUE_IDX) violated


SQL> insert into table1 values( 1, 'Foo', 'Zee', 'N' );

1 row created.

关于sql - Oracle:基于函数的索引选择性唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6702367/

相关文章:

sql - 范围 : Sort by difference between two dates

javascript - Excel 就像在 javascript 中建立索引

postgresql - Postgres GIN 索引不是通过 Liquibase 脚本创建的

indexing - 如何使用tinkerpop API 3 在 titan 1.0 中对复合索引进行不区分大小写的搜索

mysql - 如何将远程位置 xml 文件数据加载到 mysql/(任何其他)数据库

sql - 在 SQL Server 中将秒转换为日期时间

oracle - 是否可以部分刷新 Oracle 中的物化 View ?

java - 无法使用 Oracle XE 维护 JDBC 连接

java - 将 JSON 保存在 oracle 数据库中

sql - 使用 SSIS 中的参数进行日期计算未给出正确的结果