表数据   COL1           COL2
               A 
               A
               B                       1
               B                       1  两个字段的唯一约束 ,一个字段非空  ,一个字段可以为空 ,想实现仅对非空数据进行唯一性约束  ,允许上面例子 A的情况存在,不允许 B的情况存在,目前已经有存在B数据的情况,忽略原有的重复数据,以后不允许出现     麻烦各位大牛  

解决方案 »

  1.   


    -- 给你写个例子SQL> 
    SQL> create table test(a varchar(10) not null, b varchar(10));
    Table created
    SQL> begin
      2     insert into test values('A',NULL);
      3     insert into test values('A',NULL);
      4     insert into test values('B','1');
      5     insert into test values('B','1');
      6  end;
      7  /
    PL/SQL procedure successfully completed
    SQL> alter table test
      2  add constraint uk_test unique (a,b) deferrable disable novalidate;
    Table altered
    SQL> alter table test enable novalidate constraint uk_test;
    Table altered
    SQL> insert into test values('A',NULL) ;
    insert into test values('A',NULL)
    ORA-00001: 违反唯一约束条件 (ITSM_USER.UK_TEST)
    SQL> commit ;
    Commit complete
    SQL> insert into test values('C',NULL) ;
    1 row inserted
    SQL> commit ;
    Commit complete
    SQL> insert into test values('C',NULL) ;
    insert into test values('C',NULL)
    ORA-00001: 违反唯一约束条件 (ITSM_USER.UK_TEST)
    SQL> commit ;
    Commit complete
    SQL> select * from test ;
    A          B
    ---------- ----------
    A          
    A          
    B          1
    B          1
    C          
    SQL> drop table test purge;
    Table droppedSQL> 
      

  2.   

      老师,你这个 'A',NULL  这样的数据就插入不进去了  
      

  3.   

    单个值NULL可以随意插入进去,不报错。但是当唯一约束为复合字段时,则情况发生了变化。根据Oracle文档的描述,对于复合字段的唯一约束,不为空字段的值是不能重复的。也就是说,如果两个字段构成了一个唯一约束,其中一个字段为空,那么另一个字段的值不能出现重复。
      

  4.   

    col1,col2联合唯一约束