比如我的表包括
UserID,FailFlag
FailFlag表示这条数据是否失效,当FailFlag标为1这条数据失效,但为了以后查询仍在数据库中保留此数据,我想保证所有FailFlag=0的UserID复合唯一性约束,而且FailFlag=1的UserID有多少条重复都没关系,这种情况下用联合主键达不到唯一约束,请问有什么办法?

解决方案 »

  1.   


    SQL> create table t(user_id int, fail_flag number(1));表已创建。SQL> create unique index idx_t_user_id_flag on t(case when fail_flag=1 then null else user_id end, case when fail_flag=1 then null else fail_flag end);索引已创建。SQL> insert into t values(1, 1);已创建 1 行。SQL> insert into t values(1, 0);已创建 1 行。SQL> insert into t values(1, 0);
    insert into t values(1, 0)
    *
    ERROR 位于第 1 行: 
    ORA-00001: 违反唯一约束条件 (SCOTT.IDX_T_USER_ID_FLAG) 
    SQL> insert into t values(1, 1);已创建 1 行。SQL> insert into t values(1, 1);已创建 1 行。SQL> select * from t;   USER_ID  FAIL_FLAG                                                           
    ---------- ----------                                                           
             1          1                                                           
             1          0                                                           
             1          1                                                           
             1          1                                                           
      

  2.   

    case when fail_flag=1 then null else fail_flag end
    这个还有必要吗?我也刚刚查到解决方法
    CREATE UNIQUE INDEX IDX_TEST ON table(DECODE(FailFlag,0,UserID))