加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:58:26 所属栏目:MsSql教程 来源:网络整理
导读:我必须保留历史记录,所以我使用的是is_deleted列,它可以有’Y’或’N’.但对于任何is_deleted’N’的实例,我应该为(a,b,c)复合列提供unwue条目. 当我尝试创建基于函数的唯一索引时,我收到错误. CREATE UNIQUE INDEX fn_unique_idx ON table1 (CASE WHEN is_de
我必须保留历史记录,所以我使用的是is_deleted列,它可以有’Y’或’N’.但对于任何is_deleted’N’的实例,我应该为(a,b,c)复合列提供unwue条目.

当我尝试创建基于函数的唯一索引时,我收到错误.

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,'Y' );

1 row created.

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


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

1 row created.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读