请教大侠下,对一张表添加约束,能带有if条件的吗?比如:表AA,有其中字段type,外键schdeule_id,如果type有添加约束只能是'aa','bb','cc',然后如果type='aa'时,那么外键schdeule_id不能为空,如果是'bb','cc'那就可以为空,这样现在添加约束,谢谢大家了,我查了很多都没有这样的,希望有写过的能帮写下,谢谢了,在线等

解决方案 »

  1.   

    check好像没那么强大,写触发器好了
      

  2.   

          支持happy的论断!
          自己也happy一下!呵呵!
      

  3.   

    可以变通一下
    SQL> 
    SQL> create table abcd(id number,type varchar2(2),schdeule_id char(20),
      2    constraint abcd_1 foreign key(schdeule_id) references abc(a),
      3    constraint abcd_2 check(type in ('aa','bb','cc') and case type when 'aa' then schdeule_id else '1' end is not null));
     
    Table created
     
    SQL> insert into abcd values(1,'dd',null);
     
    insert into abcd values(1,'dd',null)
     
    ORA-02290: 违反检查约束条件 (W.ABCD_2)
     
    SQL> insert into abcd values(1,'bb',null);
     
    1 row inserted
     
    SQL> insert into abcd values(2,'aa',null);
     
    insert into abcd values(2,'aa',null)
     
    ORA-02290: 违反检查约束条件 (W.ABCD_2)
     
    SQL> insert into abcd values(3,'aa','2');
     
    1 row inserted
     
    SQL> insert into abcd values(4,'aa','123');
     
    insert into abcd values(4,'aa','123')
     
    ORA-02291: 违反完整约束条件 (W.ABCD_1) - 未找到父项关键字
     
    SQL> 
      

  4.   

     else '1' end is not null的else '1' end是什么意思呢!
      

  5.   

    if是pl/sql里的语法,sql中要用case
    若type不是'aa',则取'1',这个'1'也可以用其他的非空字符代替,类型要与else前取的schdeule_id一致,使非空判断恒成立
    若type 为'aa',则用schdeule_id来判断是否非空
      

  6.   


    SQL> alter table plan_schedule add constraint CONT_SCHEDULE_TYPE_SCHEDULE_ID check(SCHEDULE_TYPE IN('PlanSchedule','Annual','Month')and case SCHEDULE_TYPE when 'PlanSchedule' then CURRENT_STATUS_ID else '1' end is not null);alter table plan_schedule add constraint CONT_SCHEDULE_TYPE_SCHEDULE_ID check(SCHEDULE_TYPE IN('PlanSchedule','Annual','Month')and case SCHEDULE_TYPE when 'PlanSchedule' then CURRENT_STATUS_ID else '1' end is not null)ORA-00932: 数据类型不一致: 应为 NUMBER, 但却获得 CHAR
    数据类型CURRENT_STATUS_ID 是number,这个要怎么改
      

  7.   

    SQL> alter table plan_schedule add constraint CONT_SCHEDULE_TYPE_SCHEDULE_ID check(SCHEDULE_TYPE IN('PlanSchedule','Annual','Month')and case SCHEDULE_TYPE when 'PlanSchedule' then CURRENT_STATUS_ID else 1 end is not null);Table altered把单引号去掉可以成功了
      

  8.   

    非常感谢8楼的wildwave大侠的帮助,我很想给你加分,但是刚才已经结贴了不懂怎么给你追加分数,很抱歉,谢谢你,好人一生平安!